配置Mysql实现主从复制与读写分离
環(huán)境說(shuō)明
主從復(fù)制使用mysql自帶的master與slave機(jī)制;讀寫分離使用mysql-proxy實(shí)現(xiàn)!
有服務(wù)器三臺(tái):s1,s2,s3。
s1為web服務(wù)器,裝有httpd,php,mysql,mysql-proxy。
s2為主數(shù)據(jù)庫(kù)服務(wù)器(Master),僅裝mysql。
s3為從數(shù)據(jù)庫(kù)服務(wù)器(Salve),僅裝mysql。
實(shí)現(xiàn)目標(biāo)
s1上的網(wǎng)站的數(shù)據(jù)庫(kù)讀寫操作分?jǐn)偟絪2和s3上,即s2專門進(jìn)行寫操作(也可以讀),s3專門進(jìn)行讀操作;
s2上的數(shù)據(jù)庫(kù)中有數(shù)據(jù)更新時(shí),自動(dòng)將變化同步到s3上的數(shù)據(jù)庫(kù)中。
配置主從復(fù)制(涉及的服務(wù)器:s2,s3)
1.首先在主數(shù)據(jù)庫(kù)服務(wù)器(master)s2上進(jìn)行配置
#編輯mysql配置文件 vim /etc/my.cnf#整體內(nèi)容如下: [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 #重要,需和副數(shù)據(jù)庫(kù)的id區(qū)分開,主為1,副為2 log-bin=mysql-bin #定義二進(jìn)制log文件,從數(shù)據(jù)庫(kù)將通過(guò)讀取二進(jìn)制log文件來(lái)更新 binlog-ignore-db=mysql #定義忽略的數(shù)據(jù)庫(kù),即不需要同步的數(shù)據(jù)庫(kù) binlog-do-db=testdb #定義需要同步的數(shù)據(jù)庫(kù),如果沒有此,將同步所有數(shù)據(jù)庫(kù)(除了上面ignore的數(shù)據(jù)庫(kù))[mysqld_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid2.在主數(shù)據(jù)庫(kù)服務(wù)器(master)s2上的mysql中創(chuàng)建一個(gè)供副數(shù)據(jù)庫(kù)(slave)s3連接的賬號(hào)
#在主數(shù)據(jù)庫(kù)服務(wù)器上進(jìn)入mysql命令行 mysql -u root -p (輸入密碼)#成功進(jìn)入mysql命令行,新建一個(gè)用戶 mysql>grant replication slave on *.* to '用戶名'@'副數(shù)據(jù)庫(kù)的IP地址' identified by '密碼';#查看創(chuàng)建用戶是否成功 mysql>select user,host from mysql.user;?
3.重啟主數(shù)據(jù)庫(kù)服務(wù)器上的mysql服務(wù)
service mysqld restart4.記錄主數(shù)據(jù)庫(kù)服務(wù)器的master狀態(tài),在配置從服務(wù)器時(shí)需要使用到
#同樣進(jìn)入mysql命令行 mysql>show master status;類似于此內(nèi)容:
記下Flie和Position。需要注意的是這兩個(gè)值在mysql重啟后變化。所以在第一次配置從服務(wù)器時(shí),需要注意了!
主數(shù)據(jù)庫(kù)的配置完成,現(xiàn)在開始從數(shù)據(jù)庫(kù)服務(wù)器。
5.配置從數(shù)據(jù)庫(kù)服務(wù)器上的my.cnf文件
vim /etc/my.cnf#整體內(nèi)容如: [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 #重要,與主數(shù)據(jù)上id不一樣[mysqld_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid6.重啟從數(shù)據(jù)庫(kù)服務(wù)器的mysqld
service mysqld restart?
7.進(jìn)入mysql命令行,執(zhí)行change master to命令
#進(jìn)入mysql mysql -u root -p (輸入密碼)#進(jìn)入mysql后,先停止slave mysql>slave stop; mysql>change master to>master_host='主數(shù)據(jù)庫(kù)的ip地址或者h(yuǎn)ostname',>master_user='主數(shù)據(jù)庫(kù)中允許從數(shù)據(jù)庫(kù)連接它的用戶名',>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狀態(tài) mysql>show slave status\G;在看到的slave狀態(tài)中,關(guān)鍵信息為:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
如果這兩項(xiàng)都為Yes,說(shuō)明主從之間復(fù)制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)最后,可以測(cè)試下,在主數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)數(shù)據(jù)庫(kù),創(chuàng)建一張表,插入點(diǎn)數(shù)據(jù),然后在從數(shù)據(jù)庫(kù)中看時(shí)候有數(shù)據(jù)!
配置讀寫分離(涉及的服務(wù)器s1,s2,s3)
1.首先我們想要在web服務(wù)器上安裝mysql-proxy,并配置好它,mysql-proxy官網(wǎng)下載
#進(jìn)入mysqlproxy的目錄 cd /opt/mysql-proxy?
#創(chuàng)建mysqlproxy.cnf文件 vim mysqlproxy.cnf #整體內(nèi)容如下 [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=主數(shù)據(jù)庫(kù)服務(wù)器IP:端口(默認(rèn)3306) proxy-read-only-backend-addresses=從數(shù)據(jù)庫(kù)服務(wù)器IP:端口(默認(rèn)3306)?
#編輯環(huán)境變量文件 vim /etc/profile?
#在最后加入下列兩行內(nèi)容(路徑自行修改) PATH=/opt/mysql-proxy/bin:/opt/mysql-proxy/share/doc/mysql-proxy:$PATH export PATH #可以創(chuàng)建一個(gè)簡(jiǎn)單的腳本,以便于開機(jī)啟動(dòng) vim mysqlproxy #內(nèi)容如下: #!/bin/bash mysql-proxy --defaults-file=/opt/mysql-proxy/mysqlproxy.cnf #創(chuàng)建好后,把mysqlproxy文件復(fù)制到/opt/mysql-proxy/bin目錄下#在開機(jī)啟動(dòng)項(xiàng)中,可以加入mysqlproxy vim etc/rc.d/rc.local #加入: mysqlproxy#確認(rèn)mysqlproxy文件是否具有可執(zhí)行權(quán)限 #最后修改rw-splitting.lua文件 vim /opt/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua #修改這兩個(gè)值 min_idle_connections = 1, //默認(rèn)為4 max_idle_connections = 1, //默認(rèn)為8?
2.在主數(shù)據(jù)庫(kù)服務(wù)器上進(jìn)入mysql命令行,創(chuàng)建一個(gè)用戶
mysql -u root -p#進(jìn)入mysql后 mysql>grant all on *.* to '用戶名'@'web服務(wù)器地址' identified by '密碼';此時(shí)由于主數(shù)據(jù)庫(kù)和從數(shù)據(jù)庫(kù)是主從復(fù)制,從數(shù)據(jù)庫(kù)上應(yīng)該已經(jīng)有了上面新建的用戶了。
?
如果還沒配置主從復(fù)制,在從服務(wù)器上執(zhí)行下grant就好。
重要配置已經(jīng)完成了,最后就要確定下防火墻(iptables)了。
web服務(wù)器的mysql-proxy默認(rèn)端口為4040,主從兩個(gè)數(shù)據(jù)庫(kù)3306端口。
測(cè)試讀寫分離
在web服務(wù)器上通過(guò)mysql連接4040端口:
#用戶名為上面第二步中新建的用戶,hostname為其對(duì)應(yīng)的hostname(即web服務(wù)器地址) mysql -u 用戶名 -p -P 4040 -h hostname輸入密碼后,通過(guò)web服務(wù)器就能連接到s2,所做的變更將直接在s2上生效,而s3將通過(guò)主從復(fù)制,實(shí)現(xiàn)同步!
?
注:web服務(wù)器的mysql的3306端口,不參與讀寫分離主從復(fù)制!web服務(wù)器上的網(wǎng)站程序數(shù)據(jù)庫(kù)只需要連接4040端口即可!
?
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/keheng/articles/3721107.html
總結(jié)
以上是生活随笔為你收集整理的配置Mysql实现主从复制与读写分离的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 文本框输入怎么样让键盘消失
- 下一篇: mysql从5.5直接升级到5.7后,执