首先我們說說主從復制的原理,這個是必須要理解的玩意兒:
理解:
-
MySQL之間的數據復制的基礎就是二進制日志文件bin log ,Master的所有操作都會紀錄在二進制日志文件中,其他MySQL通過一個IO線程與其進行通信,監控這個日志文件的變化,並將變化賦值到Slave的中繼日志relay中,然后SQL線程會執行中繼日志中的相關操作,以此實現主從數據庫的一致性,也就是主從復制
主從搭建,配置 Master
准備材料如下:
-
分別裝在兩台Linux服務器上的數據庫
-
master:192.168.159.159
-
slave : 192.168.159.169
master數據庫配置文件修改:my.cnf
各自的安裝方式不一樣,我是通過rpm方式安裝的,
在這里擴展一下: 通過這兩個命令,大致發現了我的MySQL的安裝目錄
當然我的配置文件在在 /etc/mysql/my.cnf 在[mysqld]段下添加如下內容
log-bin=mysql-bin
server-id=159
然后重啟Mysql: service mysqld restart
登錄到MySQL建立賬戶並授權給Slave
mysql> CREATE USER 'chen'@'192.168.159.169' IDENTIFIED BY 'chen'; #創建用戶
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.159.169'; #為其權限
mysql>flush privileges; #刷新權限
然后查看master狀態,記錄二進制文件名( mysql-bin.000002 ) 和位置(787)
Master 到這里就配置完成了,下面配置 Slave
第一步修改從服務器的配置文件 : my.conf : server-id=135
第二步刪除UUID文件: /var/lib/mysql/auto.cnf 后重新啟動服務 :reboot
第三步登入MySQL,進行從服務器的配置 ,並開啟從服務器復制功能
-
change master to master_host='192.168.159.159',master_port=3306,master_user='chen',master_password='chen',master_log_file='mysql-bin.000002',master_log_pos=787;
-
開啟從服務器的復制功能 : start slave;
檢查從服務器的復制功能狀態:show slave status\G
-
相關的命令:
-
stop slave 可以停止 從服務器
-
reset slave 清空從服務器的規則
-
start slave 啟動從服務器
-
show slave status 查看從服務器狀態
-
-
注意:當我們已經完成了主從后,在不關閉的情況下,在創立新的主從關系會報錯
-
MySQL-Proxy實現讀寫分離
主從的作用主要體現在備份數據上,要想做到MySQL支持高可用和高並發還需要集群,完成主從復制和讀寫分離
讀寫分離環境:
-
主服務器:192.168.159.159 + MySQL-Proxy讀寫分離軟件
-
從服務器:192.168.159.169
-
從服務器:192.168.159.179
-
三台服務器都關閉防火牆 iptables -L service iptablesstop
-
三台服務器關閉selinux 采用臨時關閉,長久關閉修改 : /etc/selinux/config 將SELINUX設置為disabled
臨時關閉 :setenforce 0 | 查看狀態: getenforce
-
一、安裝MySQL-Proxy
我是上傳到 /usr/local/ 下的
tar -zxvf mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit.tar.gz #解壓文件
mv mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit mysql-proxy #更改目錄名
二、創建主配置文件
cd /usr/local/mysql-proxy
mkdir lua #創建腳本存放目錄
mkdir logs #創建日志目錄
cp share/doc/mysql-proxy/rw-splitting.lua ./lua #復制讀寫分離配置文件
cp share/doc/mysql-proxy/admin-sql.lua ./lua #復制管理腳本
vi /etc/mysql-proxy.cnf #創建配置文件,並將下面內容寫入
[mysql-proxy]
user=root
admin-username=root #主從mysql共有的用戶
admin-password=123456 #用戶的密碼
proxy-address=192.168.159.110:4040 #mysql-proxy運行ip和端口,不加端口,默認4040
proxy-read-only-backend-addresses=192.168.159.169 #指定后端從slave讀取數據
proxy-backend-addresses=192.168.159.159 #指定后端主master寫入數據
proxy-lua-script=/usr/local/mysql-proxy/lua/rw-splitting.lua #指定讀寫分離配置文件位置
admin-lua-script=/usr/local/mysql-proxy/lua/admin-sql.lua #指定管理腳本
log-file=/usr/local/mysql-proxy/logs/mysql-proxy.log #日志位置
log-level=debug #定義log日志級別,由高到低分別有(error|warning|info|message|debug)
daemon=true #以守護進程方式運行
keepalive=true #mysql-proxy崩潰時,嘗試重啟
#保存退出后 給權限
chmod 660 /etc/mysql-porxy.cnf
三、修改讀寫分離配置文件
vim /usr/local/mysql-proxy/lua/rw-splitting.lua
vim /usr/local/mysql-proxy/lua/rw-splitting.lua
if not proxy.global.config.rwsplit then
proxy.global.config.rwsplit = {
min_idle_connections = 1, #默認超過4個連接數時,才開始讀寫分離,改為1
max_idle_connections = 1, #默認8,改為1
is_debug = false
}
end
四、啟動MySQL-proxy
/usr/local/mysql-proxy/bin/mysql-proxy --defaults-file=/etc/mysql-proxy.cnf
五、測試讀寫分離
在主服務器上創建用戶用於MySQL-Proxy使用,從服務器也會同步這個操作
grant all on . to 'chen'@'192.168.159.159' identified by 'root';
mysql> grant all on *.* to 'chen'@'192.168.159.159' identified by 'root';
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
然后就報錯了,MySQL的密碼策略阻止了我們,不過沒關系,我已經見怪不怪了,設置過好多回了
SHOW VARIABLES LIKE 'validate_password%'; #查看mysql初始密碼策略
-
set global validate_password_policy=LOW; #設置密碼的驗證強度等級,只驗證密碼長度
-
set global validate_password_length=4; #默認密碼長度為8,我們給其設置為4
-
再次執行: grant all on . to 'chao'@'192.168.159.179' identified by 'root';