配置Mysql实现主从复制与读写分离
環境說明
主從復制使用mysql自帶的master與slave機制;讀寫分離使用mysql-proxy實現!
有服務器三臺:s1,s2,s3。
s1為web服務器,裝有httpd,php,mysql,mysql-proxy。
s2為主數據庫服務器(Master),僅裝mysql。
s3為從數據庫服務器(Salve),僅裝mysql。
實現目標
s1上的網站的數據庫讀寫操作分攤到s2和s3上,即s2專門進行寫操作(也可以讀),s3專門進行讀操作;
s2上的數據庫中有數據更新時,自動將變化同步到s3上的數據庫中。
配置主從復制(涉及的服務器:s2,s3)
1.首先在主數據庫服務器(master)s2上進行配置
#編輯mysql配置文件 vim /etc/my.cnf#整體內容如下: [client] default_character_set=utf8[mysqld] default_character_set=utf8 datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock user=mysql symbolic-links=0server-id=1 #重要,需和副數據庫的id區分開,主為1,副為2 log-bin=mysql-bin #定義二進制log文件,從數據庫將通過讀取二進制log文件來更新 binlog-ignore-db=mysql #定義忽略的數據庫,即不需要同步的數據庫 binlog-do-db=testdb #定義需要同步的數據庫,如果沒有此,將同步所有數據庫(除了上面ignore的數據庫)[mysqld_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid2.在主數據庫服務器(master)s2上的mysql中創建一個供副數據庫(slave)s3連接的賬號
#在主數據庫服務器上進入mysql命令行 mysql -u root -p (輸入密碼)#成功進入mysql命令行,新建一個用戶 mysql>grant replication slave on *.* to '用戶名'@'副數據庫的IP地址' identified by '密碼';#查看創建用戶是否成功 mysql>select user,host from mysql.user;?
3.重啟主數據庫服務器上的mysql服務
service mysqld restart4.記錄主數據庫服務器的master狀態,在配置從服務器時需要使用到
#同樣進入mysql命令行 mysql>show master status;類似于此內容:
記下Flie和Position。需要注意的是這兩個值在mysql重啟后變化。所以在第一次配置從服務器時,需要注意了!
主數據庫的配置完成,現在開始從數據庫服務器。
5.配置從數據庫服務器上的my.cnf文件
vim /etc/my.cnf#整體內容如: [client] default_character_set=utf8[mysqld] default_character_set=utf8 datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock user=mysql symbolic-links=0server-id=2 #重要,與主數據上id不一樣[mysqld_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid6.重啟從數據庫服務器的mysqld
service mysqld restart?
7.進入mysql命令行,執行change master to命令
#進入mysql mysql -u root -p (輸入密碼)#進入mysql后,先停止slave mysql>slave stop; mysql>change master to>master_host='主數據庫的ip地址或者hostname',>master_user='主數據庫中允許從數據庫連接它的用戶名',>master_password='這里是密碼',>master_log_file='mysql-bin.000004',>master_log_pos=261;#master_log_file,master_log_pos即上面使用show master status看到的信息 mysql>slave start;#查看slave狀態 mysql>show slave status\G;在看到的slave狀態中,關鍵信息為:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
如果這兩項都為Yes,說明主從之間復制ok了。
貼上我的slave status:
mysql> show slave status\G; *************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: s2Master_User: userssMaster_Port: 3306Connect_Retry: 60Master_Log_File: mysql-bin.000004Read_Master_Log_Pos: 2308873Relay_Log_File: mysqld-relay-bin.000288Relay_Log_Pos: 251Relay_Master_Log_File: mysql-bin.000004Slave_IO_Running: YesSlave_SQL_Running: YesReplicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0Last_Error: Skip_Counter: 0Exec_Master_Log_Pos: 2308873Relay_Log_Space: 5650Until_Condition: NoneUntil_Log_File: Until_Log_Pos: 0Master_SSL_Allowed: NoMaster_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: NoLast_IO_Errno: 0Last_IO_Error: Last_SQL_Errno: 0Last_SQL_Error: 1 row in set (0.00 sec)最后,可以測試下,在主數據庫中創建一個數據庫,創建一張表,插入點數據,然后在從數據庫中看時候有數據!
配置讀寫分離(涉及的服務器s1,s2,s3)
1.首先我們想要在web服務器上安裝mysql-proxy,并配置好它,mysql-proxy官網下載
#進入mysqlproxy的目錄 cd /opt/mysql-proxy?
#創建mysqlproxy.cnf文件 vim mysqlproxy.cnf #整體內容如下 [mysql-proxy] user=mysql daemon=true keepalive=true log-level=message log-file=/opt/mysql-proxy/mysqlproxy.log pid-file=/opt/mysql-proxy/mysqlproxy.pid proxy-backend-addresses=主數據庫服務器IP:端口(默認3306) proxy-read-only-backend-addresses=從數據庫服務器IP:端口(默認3306)?
#編輯環境變量文件 vim /etc/profile?
#在最后加入下列兩行內容(路徑自行修改) PATH=/opt/mysql-proxy/bin:/opt/mysql-proxy/share/doc/mysql-proxy:$PATH export PATH #可以創建一個簡單的腳本,以便于開機啟動 vim mysqlproxy #內容如下: #!/bin/bash mysql-proxy --defaults-file=/opt/mysql-proxy/mysqlproxy.cnf #創建好后,把mysqlproxy文件復制到/opt/mysql-proxy/bin目錄下#在開機啟動項中,可以加入mysqlproxy vim etc/rc.d/rc.local #加入: mysqlproxy#確認mysqlproxy文件是否具有可執行權限 #最后修改rw-splitting.lua文件 vim /opt/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua #修改這兩個值 min_idle_connections = 1, //默認為4 max_idle_connections = 1, //默認為8?
2.在主數據庫服務器上進入mysql命令行,創建一個用戶
mysql -u root -p#進入mysql后 mysql>grant all on *.* to '用戶名'@'web服務器地址' identified by '密碼';此時由于主數據庫和從數據庫是主從復制,從數據庫上應該已經有了上面新建的用戶了。
?
如果還沒配置主從復制,在從服務器上執行下grant就好。
重要配置已經完成了,最后就要確定下防火墻(iptables)了。
web服務器的mysql-proxy默認端口為4040,主從兩個數據庫3306端口。
測試讀寫分離
在web服務器上通過mysql連接4040端口:
#用戶名為上面第二步中新建的用戶,hostname為其對應的hostname(即web服務器地址) mysql -u 用戶名 -p -P 4040 -h hostname輸入密碼后,通過web服務器就能連接到s2,所做的變更將直接在s2上生效,而s3將通過主從復制,實現同步!
?
注:web服務器的mysql的3306端口,不參與讀寫分離主從復制!web服務器上的網站程序數據庫只需要連接4040端口即可!
?
?
?
?
轉載于:https://www.cnblogs.com/keheng/articles/3721107.html
總結
以上是生活随笔為你收集整理的配置Mysql实现主从复制与读写分离的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 文本框输入怎么样让键盘消失
- 下一篇: 将权限组件应用到新项目