一.讀寫分離說明
1、設(shè)置說明
2、安裝Mysql Proxy 在Proxy服務(wù)器上安裝即可. 如果源碼方式安裝, 需提前安裝pkg-config,libevent,glibc,lua等依賴包, 非常麻煩, 建議直接使用二進制版.
3、Mysql Proxy選項說明
管理功能選項:
代理功能選項:
其他選項:
4、數(shù)據(jù)庫準(zhǔn)備工作 (1)安裝半同步補丁(建議) 讀寫分離不能回避的問題之一就是延遲, 可以考慮Google提供的SemiSyncReplication補丁. (2)給用戶授權(quán) 在Master/Slave建立一個測試用戶, 因為以后客戶端發(fā)送的SQL都是通過Mysql Proxy服務(wù)器來轉(zhuǎn)發(fā), 所以要確??梢詮腗ysql Proxy服務(wù)器上登錄MySQL主從庫.
(3)在Master建立測試表
5、Mysql Proxy啟動 (1)修改讀寫分離lua腳本 默認最小4個最大8個以上的客戶端連接才會實現(xiàn)讀寫分離, 現(xiàn)改為最小1個最大2個:
這是因為Mysql Proxy會檢測客戶端連接, 當(dāng)連接沒有超過min_idle_connections預(yù)設(shè)值時, 不會進行讀寫分離, 即查詢操作會發(fā)生到Master上. (2)啟動Mysql Proxy 建議使用配置文件的形式啟動, 注意配置文件必須是660權(quán)限, 否則無法啟動. 如果有多個Slave的話, proxy-read-only-backend-addresses參數(shù)可以配置多個以逗號分隔的IP:Port從庫列表.
6、客戶端連接測試 (1)先停止Slave的復(fù)制進程
(2)連接Proxy端口, 插入數(shù)據(jù)
(3)多開幾個客戶端, 連接Proxy端口, 查詢數(shù)據(jù)
如果查詢不到上步新插入的數(shù)據(jù), 說明連接到了Slave, 讀寫分離成功. 在同一線程再插入數(shù)據(jù)并驗證:
發(fā)現(xiàn)insert操作成功, 但是select不出剛插入的數(shù)據(jù), 說明同一線程也讀寫分離成功. 從日志中可以驗證:
(4)測試完畢后, 啟動Slave的復(fù)制進程
7、正式環(huán)境說明 1、Mysql Proxy當(dāng)前還只是個測試版, MySQL官方還不建議用到生產(chǎn)環(huán)境中; 2、Mysql Proxy的rw-splitting.lua腳本在網(wǎng)上有很多版本, 但是最準(zhǔn)確無誤的版本仍然是源碼包中所附帶的rw-splitting.lua腳本, 如果有lua腳本編程基礎(chǔ)的話, 可以在這個腳本的基礎(chǔ)上再進行優(yōu)化; 3、Mysql Proxy實際上非常不穩(wěn)定, 在高并發(fā)或有錯誤連接的情況下, 進程很容易自動關(guān)閉, 因此打開keepalive參數(shù)讓進程自動恢復(fù)是個比較好的辦法, 但還是不能從根本上解決問題, 因此通常最穩(wěn)妥的做法是在每個從服務(wù)器上安裝一個Mysql Proxy供自身使用, 雖然比較低效但卻能保證穩(wěn)定性; 4、Amoeba for MySQL是一款優(yōu)秀的中間件軟件, 同樣可以實現(xiàn)讀寫分離, 負載均衡等功能, 并且穩(wěn)定性要大大超過Mysql Proxy, 建議大家用來替代Mysql Proxy, 甚至MySQL-Cluster.
二、MySQL一主多從同步配置 1.配置(3臺上都一樣) 在/etc目錄下可能無my.cnf文件,從/user/share/mysql目錄中拷貝my-medium.cnf 到/etc并修改成my.cnf [root@localhost etc]# cp /usr/share/mysql/my-medium.cnf my.cnf [root@localhost etc]# ll |grep my -rwxr-xr-x 1 root root 5204 Feb 13 22:52 my_bak -rwxr-xr-x 1 root root 4765 Jul 10 23:07 my.cnf master 上; [root@mysql101 ~]# vi /etc/my.cnf 1.修改master上的配置文件my.cnf。 在[mysqld]下添加如下字段: server-id = 1 log-bin=mysql-bin binlog-do-db=YYY //需要同步的數(shù)據(jù)庫 binlog-ignore-db=mysql //被忽略的數(shù)據(jù)庫 binlog-ignore-db=information-schema //被忽略的數(shù)據(jù)庫 在master上為slave添加一個同步賬號 mysql> grant replication slave on *.* to 'affairlog'@'192.168.2.182' identified by 'pwd123'; //在slave1上登陸成功 mysql> grant replication slave on *.* to 'affairlog'@'192.168.2.111' identified by 'pwd123'; //在slave2上登陸成功 保存后,重啟master的mysql服務(wù): service mysql restart; 用show master status命令查看日志情況 mysql> show master status\G; *************************** 1. row *************************** File: mysql-bin.000087 Position: 106 Binlog_Do_DB: YYY Binlog_Ignore_DB: mysql,information-schema 1 row in set (0.00 sec) 2.修改slave1上的配置文件my.cnf。 在[mysqld]下添加如下字段 [root@mysql182 ~]# vi /etc/my.cnf server-id=182 master-host=192.168.3.101 master-user= affairlog master-password=pwd123 master-port=3306 master-connect-retry=60 replicate-do-db=YYY //同步的數(shù)據(jù)庫 replicate-ignore-db=mysql //被忽略的數(shù)據(jù)庫 replicate-ignore-db=information-schema //被忽略的數(shù)據(jù)庫 查看Master上 master_log_file的文件名 和master_log_pos 。 mysql>change master to master_host='192.168.3.101' master_user='affairlog' master_password='pwd123' master_log_file='mysql-bin.000087' master_log_pos=1845; 保存后,重啟slave的mysql服務(wù): service mysql restart; 修改slave2上的配置文件my.cnf,和上面類似,只是把server-id改下,為了方便,我都用了相應(yīng)的ip某位, so,slave2上我設(shè)置的server-id是111。 在進入兩個slave機中的mysql。 mysql>start slave; mysql>show slave status\G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.3.101 Master_User: affairlog Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000087 Read_Master_Log_Pos: 106 Relay_Log_File: vm111-relay-bin.000002 Relay_Log_Pos: 251 Relay_Master_Log_File: mysql-bin.000087 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: YYY Replicate_Ignore_DB: mysql,information-schema Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 106 Relay_Log_Space: 406 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_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: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: 1 row in set (0.00 sec) 如果兩個slave中的Slave_IO_Running、Slave_SQL_Running狀態(tài)均為Yes則表明設(shè)置成功。 Slave_IO_Running:連接到主庫,并讀取主庫的日志到本地,生成本地日志文件 Slave_SQL_Running:讀取本地日志文件,并執(zhí)行日志里的SQL命令。 三、MySQL分庫分表方案:https://my.oschina.net/ydsakyclguozi/blog/199498 Mysql Proxy Lua讀寫分離設(shè)置一.讀寫分離說明
1、設(shè)置說明
2、安裝Mysql Proxy 在Proxy服務(wù)器上安裝即可. 如果源碼方式安裝, 需提前安裝pkg-config,libevent,glibc,lua等依賴包, 非常麻煩, 建議直接使用二進制版.
3、Mysql Proxy選項說明
管理功能選項:
代理功能選項:
其他選項:
4、數(shù)據(jù)庫準(zhǔn)備工作 (1)安裝半同步補丁(建議) 讀寫分離不能回避的問題之一就是延遲, 可以考慮Google提供的SemiSyncReplication補丁. (2)給用戶授權(quán) 在Master/Slave建立一個測試用戶, 因為以后客戶端發(fā)送的SQL都是通過Mysql Proxy服務(wù)器來轉(zhuǎn)發(fā), 所以要確??梢詮腗ysql Proxy服務(wù)器上登錄MySQL主從庫.
(3)在Master建立測試表
5、Mysql Proxy啟動 (1)修改讀寫分離lua腳本 默認最小4個最大8個以上的客戶端連接才會實現(xiàn)讀寫分離, 現(xiàn)改為最小1個最大2個:
這是因為Mysql Proxy會檢測客戶端連接, 當(dāng)連接沒有超過min_idle_connections預(yù)設(shè)值時, 不會進行讀寫分離, 即查詢操作會發(fā)生到Master上. (2)啟動Mysql Proxy 建議使用配置文件的形式啟動, 注意配置文件必須是660權(quán)限, 否則無法啟動. 如果有多個Slave的話, proxy-read-only-backend-addresses參數(shù)可以配置多個以逗號分隔的IP:Port從庫列表.
6、客戶端連接測試 (1)先停止Slave的復(fù)制進程
(2)連接Proxy端口, 插入數(shù)據(jù)
(3)多開幾個客戶端, 連接Proxy端口, 查詢數(shù)據(jù)
如果查詢不到上步新插入的數(shù)據(jù), 說明連接到了Slave, 讀寫分離成功. 在同一線程再插入數(shù)據(jù)并驗證:
發(fā)現(xiàn)insert操作成功, 但是select不出剛插入的數(shù)據(jù), 說明同一線程也讀寫分離成功. 從日志中可以驗證:
(4)測試完畢后, 啟動Slave的復(fù)制進程
7、正式環(huán)境說明 1、Mysql Proxy當(dāng)前還只是個測試版, MySQL官方還不建議用到生產(chǎn)環(huán)境中; 2、Mysql Proxy的rw-splitting.lua腳本在網(wǎng)上有很多版本, 但是最準(zhǔn)確無誤的版本仍然是源碼包中所附帶的rw-splitting.lua腳本, 如果有lua腳本編程基礎(chǔ)的話, 可以在這個腳本的基礎(chǔ)上再進行優(yōu)化; 3、Mysql Proxy實際上非常不穩(wěn)定, 在高并發(fā)或有錯誤連接的情況下, 進程很容易自動關(guān)閉, 因此打開keepalive參數(shù)讓進程自動恢復(fù)是個比較好的辦法, 但還是不能從根本上解決問題, 因此通常最穩(wěn)妥的做法是在每個從服務(wù)器上安裝一個Mysql Proxy供自身使用, 雖然比較低效但卻能保證穩(wěn)定性; 4、Amoeba for MySQL是一款優(yōu)秀的中間件軟件, 同樣可以實現(xiàn)讀寫分離, 負載均衡等功能, 并且穩(wěn)定性要大大超過Mysql Proxy, 建議大家用來替代Mysql Proxy, 甚至MySQL-Cluster.
二、MySQL一主多從同步配置 1.配置(3臺上都一樣) 在/etc目錄下可能無my.cnf文件,從/user/share/mysql目錄中拷貝my-medium.cnf 到/etc并修改成my.cnf [root@localhost etc]# cp /usr/share/mysql/my-medium.cnf my.cnf [root@localhost etc]# ll |grep my -rwxr-xr-x 1 root root 5204 Feb 13 22:52 my_bak -rwxr-xr-x 1 root root 4765 Jul 10 23:07 my.cnf master 上; [root@mysql101 ~]# vi /etc/my.cnf 1.修改master上的配置文件my.cnf。 在[mysqld]下添加如下字段: server-id = 1 log-bin=mysql-bin binlog-do-db=YYY //需要同步的數(shù)據(jù)庫 binlog-ignore-db=mysql //被忽略的數(shù)據(jù)庫 binlog-ignore-db=information-schema //被忽略的數(shù)據(jù)庫 在master上為slave添加一個同步賬號 mysql> grant replication slave on *.* to 'affairlog'@'192.168.2.182' identified by 'pwd123'; //在slave1上登陸成功 mysql> grant replication slave on *.* to 'affairlog'@'192.168.2.111' identified by 'pwd123'; //在slave2上登陸成功 保存后,重啟master的mysql服務(wù): service mysql restart; 用show master status命令查看日志情況 mysql> show master status\G; *************************** 1. row *************************** File: mysql-bin.000087 Position: 106 Binlog_Do_DB: YYY Binlog_Ignore_DB: mysql,information-schema 1 row in set (0.00 sec) 2.修改slave1上的配置文件my.cnf。 在[mysqld]下添加如下字段 [root@mysql182 ~]# vi /etc/my.cnf server-id=182 master-host=192.168.3.101 master-user= affairlog master-password=pwd123 master-port=3306 master-connect-retry=60 replicate-do-db=YYY //同步的數(shù)據(jù)庫 replicate-ignore-db=mysql //被忽略的數(shù)據(jù)庫 replicate-ignore-db=information-schema //被忽略的數(shù)據(jù)庫 查看Master上 master_log_file的文件名 和master_log_pos 。 mysql>change master to master_host='192.168.3.101' master_user='affairlog' master_password='pwd123' master_log_file='mysql-bin.000087' master_log_pos=1845; 保存后,重啟slave的mysql服務(wù): service mysql restart; 修改slave2上的配置文件my.cnf,和上面類似,只是把server-id改下,為了方便,我都用了相應(yīng)的ip某位, so,slave2上我設(shè)置的server-id是111。 在進入兩個slave機中的mysql。 mysql>start slave; mysql>show slave status\G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.3.101 Master_User: affairlog Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000087 Read_Master_Log_Pos: 106 Relay_Log_File: vm111-relay-bin.000002 Relay_Log_Pos: 251 Relay_Master_Log_File: mysql-bin.000087 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: YYY Replicate_Ignore_DB: mysql,information-schema Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 106 Relay_Log_Space: 406 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_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: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: 1 row in set (0.00 sec) 如果兩個slave中的Slave_IO_Running、Slave_SQL_Running狀態(tài)均為Yes則表明設(shè)置成功。 Slave_IO_Running:連接到主庫,并讀取主庫的日志到本地,生成本地日志文件 Slave_SQL_Running:讀取本地日志文件,并執(zhí)行日志里的SQL命令。 |
|
來自: 昵稱25533110 > 《待分類1》