mysql基於mysql-proxy和amoeba的讀寫分離
以及tcpdump+wireshark工具驗證
【實驗部署準備】
1,首先對後端節點部署主從關係。
2,然後前端MySQL-proxy對後端進行讀寫分離。
3.後端各節點都要授權
4.
三個節點保持時間一致
[root@node3 ~]# crontab -e #####時間一致性
*/3 * * * * /usr/sbin/ntpdate 172.16.0.1 &> /dev/null
###############################對後端節點做主從複製#################################################
############注意對於mysql的安裝這裏不再介紹,直接進入配置。
###########################修改主節點配置文件########################################################
[root@director2 ~ ]#vim /etc/mysql/my.cn [mysqld] 42 thread_concurrency= 8 43 innodb_file_per_table = on 44 datadir = /mydata ###############庫目錄 45 skip_name_resolve = on ###############不反解主機名 59 log-bin=mysql-bin ###############啓用二進制日誌 67 server-id = 1 ###############唯一ID [root@director2 ~ ]# chkconfig --list mysqld #####保證mysqld的開啓自啓動 mysqld 0:off 1:off 2:on 3:on 4:on 5:on 6:off
############################授權一個有複製權限的用戶給從節點######################################
mysql>grant replication client,replication slave on *.* to 'cpuser'@'172.16.249.141' identified by "magedu"; Query OK, 0 rows affected (0.08 sec) mysql> flush privileges; Query OK, 0 rows affected (0.01 sec)
###########################從節點準備##############################################################
[root@node2 ~ ]# groupadd -g 306 mysql [root@node2 ~ ]# useradd -g 306 -u 306 mysql [root@node2 ~ ]# mkdir /mydata [root@node2 ~ ]# cd /mydata/ [root@node2 / ]# chown -R mysql:mysql /mydata/ [root@node2 / ]# chmod -R a+w /mydata/
###########################把mysql文件傳輸給從節點#################################################
[root@node2 mysql ]#mkdir /etc/mysql [root@node2 mysql ]# scripts/mysql_install_db --user=mysql--datadir=/mydata ###初始化 [root@director2 ~ ]# scp /etc/mysql/my.cnf 172.16.249.141:/etc/mysql/ ###把主節點的配置文件拷貝過來 [root@node2 / ]# vim /etc/mysql/my.cnf ####編輯從節點的配置文件 59 #log-bin=mysql-bin ####從節點不啓用二禁止日誌 67 server-id = 20 ##server-id保持唯一 68 relay-log = relay-bin ####從節點開啓中繼日誌 69 read-only =on ####只讀模式開啓(注意:這個只能限制普通用戶)
方法二:此處也可以直接施加讀鎖。在mysql> lock tables testdb read;
mysql> show variables like 'relay%'; #####中繼日誌開啓了 +-----------------------+---------------------+ | Variable_name | Value | +-----------------------+---------------------+ |relay_log | relay-bin | |relay_log_index | | |relay_log_info_file | relay-log.info | |relay_log_purge | ON | |relay_log_recovery | OFF | |relay_log_space_limit | 0 | +-----------------------+---------------------+ mysql> show variables like "read%"; #############只讀模式開啓 +----------------------+-----------------------+ |Variable_name | Value | +----------------------+-----------------------+ |read_buffer_size | 1048576 | |read_only | ON | |read_rnd_buffer_size | 4194304 | +----------------------+-----------------------+
#############################至此主從各單個節點配置結束#####################################
#############################配置從連接主節點################################################
#####主節點查看二進制文件的存儲位置
mysql> show master status; +----------------------+----------------+--------------+------------------------------+ | File | Position | Binlog_Do_DB |Binlog_Ignore_DB | +----------------------+----------------+--------------+------------------------------+ | mysql-bin.000003 | 501 | | | +----------------------+----------------+--------------+------------------------------+ 1 row in set (0.04 sec) #######################建立主從連接###################################################### mysql> change master to master_host='172.16.11.3',master_user='cpuser',master_password='magedu',master_log_file='mysql-bin.000003',master_log_pos=501; mysql> show slave status\G; #####查看當前從節點狀態 ***************************1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 172.16.249.141 Master_User: cpuser Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000003 Read_Master_Log_Pos: 501 Relay_Log_File: relay-bin.000002 Relay_Log_Pos: 529 Relay_Master_Log_File: mysql-bin.000003 Slave_IO_Running: Yes ###IO線程啓用 Slave_SQL_Running: Yes ###SQL線程已經啓用
#########################測試結果#########################################
######主節點創建庫
mysql> create database testdb; Query OK, 1 row affected (0.03 sec) mysql> use testdb; Database changed 從節點已經同步了:
#################################創建一個表###############################################
mysql> create table students(id tinyint unsigned not null auto_increment unique key); Query OK, 0 rows affected (0.25 sec)
#######################主從配置測試完畢#####################################
#####################開始配置mysql-proxy####################################
##但是要注意,因爲這個文件是不包含讀寫分離腳本的。因此,我們還需要下載一個mysql-proxy把裏面的讀寫分離腳本複製過來就好了.
[root@node2 ~ ]# yuminstall mysql-proxy -y [root@node2 lua ]#tar xf mysql-proxy-0.8.3-linux-glibc2.3-x86-64bit.tar.gz [root@node2mysql-proxy ]# pwd /root/mysql-proxy-0.8.3-linux-glibc2.3-x86-64bit/share/doc/mysql-proxy [root@node2mysql-proxy ]# cp rw-splitting.lua /usr/lib64/mysql-proxy/lua/ [root@node2mysql-proxy ]# cd /usr/lib64/mysql-proxy/lua/ [root@node2 lua ]# chown -R root:mysql-proxy * ## ####修改文件屬主屬組 [root@node2 lua ]# chmod a+x rw-splitting.lua ###給腳本執行權限 [root@node2 ~ ]# vim /etc/mysql-proxy.cnf ###修改配置文件
1 [mysql-proxy] 2 daemon = true 3 pid-file = /var/run/mysql-proxy.pid 4 log-file = /var/log/mysql-proxy.log 5 log-level = debug 6 max-open-files = 1024 7 plugins = admin,proxy 8 user = mysql-proxy 9 # 10 #Proxy Configuration 11 proxy-address =0.0.0.0:3306 ####用於連接後端msyql的賬號和端口 12 proxy-backend-addresses = 172.16.11.3:3306 ####後端寫節點 13 proxy-read-only-backend-addresses =172.16.249.141:3306 ####後端讀節點,多個用逗號分隔 14 proxy-lua-script =/usr/lib64/mysql-proxy/lua/rw-splitting.lua ####讀寫分離用到的腳本 15 #proxy-skip-profiling = true 16 # 17 # Admin Configuration 18 admin-address =0.0.0.0:4041 ####管理端口和地址 19 admin-lua-script =/usr/lib64/mysql-proxy/lua/admin.lua ####管理端口用到的腳本 20 admin-username = admin ####管理的賬號 21 admin-password = admin ####管理的密碼
#############################啓動mysql-proxy#######################################
[root@node2 lua ]#netstat -tunlp tcp 0 0 0.0.0.0:4041 0.0.0.0:* LISTEN 2019/mysql-proxy tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 2019/mysql-proxy
注意:如果先要前端的代裏可以連入後端還要求各後端都給予授權。
######master:
mysql> grant all on *.* to 'admin'@'%' identified by 'admin'; Query OK, 0 rows affected (0.11 sec) mysql> flush privileges; Query OK, 0 rows affected (0.01 sec) ######slave: mysql> grant all on *.* to 'admin'@'%' identified by 'admin'; Query OK, 0 rows affected (0.01 sec) mysql> flush privileges; Query OK, 0 rows affected (0.00 sec)
##############################這時連入測試#####################################
[root@node2 ~ ]# mysql -uadmin -padmin -h172.16.249.106 --port=3306
##########測試寫
#########主節點已經有了
##########測試讀
[root@node2 ~ ]#mysql -uadmin -padmin -h172.16.249.106 -e 'show databases;' [root@node2 ~ ]#mysql -uadmin -padmin -h172.16.249.106 --port=4041
######UP就說明讀寫已經全部啓用了##################################################
################################或者我們可以抓包驗證###########################
[root@node3 ~]# tcpdump -i eth0 -w ~/mysql.pkg port 3306