mysql集群架構方式很多,根據不同的需求做不一樣的架構,簡單一點的就是mysql的replication,也就是Mysql的復制功能,模式有:master-slaves,master-slaves-slaves,master-master-slaves等可以有多個分層,那麼現在我所要說的是master-slaves的模式(其他的模式原理基本都一樣),然後再通過mysql官方提供的Mysql-proxy實現讀寫分離,達到負載均衡的效果。
環境:
主機:master:192.168.1.109,slave1:192.168.1.110,mysqlProxy:192.168.1.112。(workstation10平台創建虛擬機模擬)
操作系統:Red Hat Enterprise Linux Server release 5.8
mysql:mysql-5.5.37-linux2.6-i686.tar.gz
mysql-proxy:mysql-proxy-0.8.4-linux-glibc2.3-x86-32bit.tar.gz
1、安裝mysql:
[root@localhost ~]# cd /usr/local //進入到安裝目錄
[root@localhost local]# tar -zxvf mysql-5.5.37-linux2.6-i686.tar.gz //解壓mysql二進制包
[root@localhost local]# ln -s mysql-5.5.37-linux2.6-i686 mysql //解壓之後加上鏈接
[root@localhost local]# groupadd mysql //增加mysql用戶組
[root@localhost local]# useradd -g mysql mysql //增加mysql用戶帳號
[root@localhost local]# cd mysql //進入安裝之後的mysql目錄
[root@localhost mysql]# chown -R root:mysql . //修改文件屬組和屬主,注意該命令後面有一個點,表示當前目錄
[root@localhost mysql]# chown -R mysql:mysql data/ //把data目錄的屬主改為mysql
[root@localhost mysql]# cp support-files/my-large.cnf /etc/my.cnf //拷貝mysql配置文件放在etc目錄下並改名為my.cnf
[root@localhost mysql]# cp support-files/mysql.server /etc/init.d/mysqld //拷貝mysql的啟動腳本放在/etc/init.d/目錄下
[root@localhost mysql]# service mysqld start //啟動mysql
至此mysql安裝已經結束,接下來就是mysql的主從配置。(其他兩台主機也照此安裝mysql)
2、配置master:
[root@localhost mysql]# vi /etc/my.cnf //編輯配置文件
server-id=1 //默認是1,不是的話則改為1
thread_concurrency = 2 //線程並發數(CPU*2)
log-bin=mysql-bin //打開二進制日志功能
保存退出,重新啟動mysql。
登入mysql:
[root@localhost mysql]# mysql -uroot -p //默認密碼空,直接敲回車進入
mysql> grant replication slave on *.* to repl@'192.168.1.%' identified by '123456';
mysql>flush privileges;
mysql>show grants for 'repl'@'192.168.1.%'; //查看授權,有記錄說明ok
mysql>show master status\G; //查看master服務器狀態,有二進制日志文件名和記錄位置(position)
至此mysql配置完成。
3、配置slave
[root@localhost mysql]#vi /etc/my.cnf //編輯配置文件
server-id=11 //設置與master不一樣就行,
thread_concurrency = 2 //線程並發數(CPU*2)
relay-log=mysql-log //打開中繼日志
relay-log-index=mysql-log.index //設置relay-log-index文件名
保存退出,重新啟動mysql。
登入mysql:
[root@localhost mysql]# mysql -uroot -p //默認密碼空,直接敲回車進入
mysql>change master to
->master_host='192.168.1.109', //master服務器ip
->mastet_user='repl', //用戶名
->mastet_password='123456', //密碼
->master_log_file='mysql-bin.000001', //master服務器二進制日志名
->master_log_pos=107;
mysql>slave start; //啟動slave
mysql> SHOW SLAVE STATUS\G; //查看slave狀態
*************************** 1. row ***************************
Slave_IO_State:
Master_Host: 192.168.1.109
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 4
Relay_Log_File: mysql-relay-bin.000001
Relay_Log_Pos: 4
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: yes
Slave_SQL_Running: yes
...omitted...
Seconds_Behind_Master: NULL
如果 Slave_IO_Running和Slave_SQL_Running顯示為yes則配置ok,過程中可能會出現:
Slave I/O: error connecting to master '[email protected]:3306' - retry-time: 60 retries: 86400, Error_code: 2003
引起問題原因是防火牆攔截了,解決辦法就是修改防火牆配置,簡單直接的辦法就是把master服務器的防火牆關掉,執行/etc/init.d/iptables stop命令。
接下來測試,在master中創建一個數據庫db_test,查看slave中是是否存在db_test。
至此slave配置結束,其他從服務器按此方式配置。
4、配置mysql-proxy,代理服務最好另外部署一台機器,尤其是上線運行後,所以這裡測試也是用了單獨一台虛擬機,沒有部署在master或slave機器上。
[root@localhost local]# tar -zxvf mysql-proxy-0.8.4-linux-glibc2.3-x86-32bit.tar.gz //解壓
[root@localhost local]# ln -s mysql-proxy-0.8.4-linux-glibc2.3-x86-32bit mysql-proxy //加一個快捷鏈接
[root@localhost local]# groupadd mysql-proxy //創建用戶組
[root@localhost local]# useradd -g mysql-proxy mysql-proxy //創建用戶
[root@localhost local]# cd mysql-proxy //進入mysql-proxy目錄
[root@localhost mysql-proxy]# chown -R root:mysql-proxy . //更改目錄屬主和屬組,命令後面有一個點(.)表示當前目錄
[root@localhost mysql-proxy]# vi /etc/profile.d/mysql-proxy.sh //把mysql的bin目錄加到PATH變量中,
export
PATH=$PATH:
/usr/local/mysql-proxy/bin
[root@localhost mysql-proxy]# source /etc/profile //讓配置文件立刻生效
[root@localhost mysql-proxy]# mysql-proxy --help-all //查看mysql-proxy命令,出現如下信息:
mysql-proxy 命令
--help-all ———— 用於獲取全部幫助信息
--proxy-address=host:port ———— 代理服務監聽的地址和端口
--admin-address=host:port ———— 管理模塊監聽的地址和端口
--proxy-backend-addresses=host:port ———— 後端mysql服務器的地址和端口(主服務器)
--proxy-read-only-backend-addresses=host:port ———— 後端只讀mysql服務器的地址和端口(從服務器)
--proxy-lua-script=file ———— 完成mysql代理功能的Lua腳本
--daemon ———— 以守護進程模式啟動mysql-proxy
--defaults-file=/path/to/conf_file_name ———— 默認使用的配置文件路徑
--log-file=/path/to/log_file_name ———— 日志文件名稱
--log-level=level ———— 日志級別
--log-use-syslog ———— 基於syslog記錄日志
--user=user_name ———— 運行mysql-proxy進程的用戶
2014-05-10 00:09:22: (critical) plugin proxy 0.8.4 started
2014-05-10 00:09:22: (debug) max open file-descriptors = 1024
2014-05-10 00:09:22: (message) proxy listening on port :4040
2014-05-10 00:09:22: (message) added read/write backend: 192.168.1.109:3306
2014-05-10 00:09:22: (message) added read-only backend: 192.168.1.110:3306
[root@localhost mysql-proxy]#netstat -ntulp | grep :4040 //查看監聽的端口
tcp 0 0 0.0.0.0:4040 0.0.0.0:* LISTEN 10056/mysql-proxy
現在我們需要在master服務器中創建一個遠程登入的mysql賬號
master:
mysql> GRANT ALL ON *.* TO root@
'192.168.1.%'
IDENTIFIED BY
'123456'
;
Query OK, 0 rows affected (0.07 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.04 sec)
在從服務器上做測試:
slave:
[root@bogon ~]
# mysql -uroot -p123456 -h192.168.1.112 --port=4040
這樣就連上了Mysql-Proxy服務器了,如果出現錯誤:ERROR 2003 (HY000): Can't connect to MySQL server on '192.168.1.112' (113),請修改防火牆配置或關閉。
下面我們來實現讀寫分離,Mysql-Proxy本身不會實現讀寫分離,主要是依靠 Lua 腳本實現的。
[root@localhost mysql-proxy]# killall mysql-proxy //殺掉mysql-proxy進程
[root@localhost mysql-proxy]# netstat -ntlup | grep 4040 //查看進程是否停掉
[root@localhost mysql-proxy]# cd share/doc/mysql-proxy/
[root@localhost mysql-proxy]# ls | grep rw-splitting.lua //查看讀寫分離腳本,lua語言實現
rw-splitting.lua
[root@localhost mysql-proxy]# mysql-proxy --daemon --log-level=debug --log-file=/var/log/mysql-proxy.log --plugins="proxy" --proxy-backend-addresses="192.168.1.109:3306" --proxy-read-only-backend-addresses="192.168.1.110:3306" --proxy-lua-script="/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua"
[root@localhost mysql-proxy]#
在slave 服務器上做測試,ok,完成了,mysql-proxy實現mysql集群的讀寫分離完成了,這種模式是MySQL集群最為基本的一種模式,也能夠實現負載均衡,後續研究MySQL更深層次的集群,一同分享一同進步。^_^