Mycat+Mysql主從復制實現雙機熱備
一、mysql主從配置原理
-
-
上圖中有兩個服務器,演示了從一個主服務器(master)把數據同步到從服務器(slave)的過程。 對於一個mysql服務器,一般有兩個線程來負責復制和被復制。當開啟復制這個開關之後(start slave) 1. 作為主服務器Master,會把自己的每一次改動都記錄到 二進制日誌 Binarylog 中。 (從服務器會負責來讀取這個log,然後在自己那裏再執行一遍。) 2. 作為從服務器Slave,會用master上的賬號登陸到master上,去讀取master的Binarylog, 然後寫入到自己的中繼日誌Relaylog,然後自己的sql線程會負責讀取這個中繼日誌,並執行一遍。到這裏主服務器上的更改就同步到從服務器上了。 在mysql上可以查看當前服務器的主,從狀態。 其實就是當前服務器的 Binary(作為主服務器角色)狀態和位置。以及其RelayLog(作為從服務器)的復制進度。
一臺機器上實現雙主熱備
mysql主從架構搭建
鏈接地址:
Mysql雙主熱備架構搭建
mysql主從架構搭建
背景知識:
-
主從這個架構可以實現數據備份,數據在多個服務器上分布等等,當然最主要的優點是可以實現負載均衡,將寫操作交給主節點,讀操作交給從節點。
-
mysql官網有很多版本,例如Enterprise(企業版需要付費,當然可以試用30天),Community(社區版,開源但是官方不提供技術支持),當然我們常用的也是社區版,本文是基於社區版的。
-
mysql的安裝也有源碼安裝和二進制免安裝等等方法,本文的mysql是通過二進制免安裝的方式安裝的
-
本文使用的環境是centos
-
mysql版本:mysql-5.7.25-linux-glibc2.12-x86_64.tar.gz
-
在/data目錄解壓兩份mysql 修改mysql的端口為3307 3308
-
首先下載二進制免安裝版的mysql:mysql社區版下載,進入社區版下載頁後選擇 MySQL Community Server (GPL),選擇要下載的mysql版本:
我這裏使用的是mysql5.7這個版本,點擊之後,選擇如下:
嫌麻煩的小夥伴可以直接運行下面的命令安裝:
wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.25-linux-glibc2.12-x86_64.tar.gz
-
下載好之後解壓重命名為mysql-3306然後復制一份,重命名為mysql-3307,我們將3306當作主節點,3307當作從節點:
#解壓 tar -zxvf mysql-5.7.25-linux-glibc2.12-x86_64.tar.gz #重命名 mv mysql-5.7.25-linux-glibc2.12-x86_64 mysql #復制一份 cp -r mysql mysql3308
-
創建幾個目錄,data,logs,config,sockets,用來管理mysql的相關文件:
mkdir data logs config sockets
-
進入config目錄,創建3307.conf以及3308.conf兩個文件,文件的內容如下:
#3307.conf配置文件內容如下:
[mysqld] user=root character-set-server=utf8 port=3307 socket=/data/mysql/sockets/3307.sock basedir=/data/mysql datadir=/data/mysql/data/3307 server-id=2 log-bin=master-bin binlog_format=ROW binlog-ignore-db=mysql binlog-ignore-db=sys binlog-ignore-db=information_schema binlog-ignore-db=performance_schema relay-log=relay-log-bin replicate-do-db=humy replicate-do-db=usemp #設置從節點只讀,註意如果是超級管理登錄從節點仍然是可以寫的,該配置只對普通用戶有效 read_only=1 #設置relay-log的路徑和名稱,如果不設置的話,默認路徑是datadir設置的路徑,默認文件名是:當前主機名-relay-log relay-log=relay-log-bin ? [mysqld_safe] log-error=/data/mysql/logs/3306.log #錯誤日誌
#3308.conf配置文件內容如下
[mysqld] user=root #設置mysql的啟動用戶,我這裏直接使用root,讀者可以創建用戶組和用戶指定操作 character-set-server=utf8 port=3308 socket=/data/mysql3308/sockets/3308.sock #設置套字節(/root/mysql/sockets為剛剛創建的sockets的路徑,3306.sock可以隨意命名,下面的data,logs也是如此) basedir=/data/mysql3308 #mysql-3306所在的位置 datadir=/data/mysql3308/data/3308 #設置mysql的數據存放目錄(也是bin_log的存放的地方) server-id=1 #唯一標識,每臺mysql服務器必須唯一 log-bin=master-bin #開啟bin-log並將此值作為二進制文件名的前綴 binlog_format=ROW #設置binlog的格式,主要有STATEMENT,ROW,FIXED #設置不需要同步給從節點的數據庫 binlog-ignore-db=mysql binlog-ignore-db=sys binlog-ignore-db=information_schema binlog-ignore-db=performance_schema replicate-do-db=humy replicate-do-db=usemp [mysqld_safe] log-error=/root/mysql3308/logs/3308.log #錯誤日誌
-
接下來讓我們開啟mysql服務:
#進入mysql的bin目錄,執行如下操作進行初始化 #-insecure的作用是不設置密碼,如果省略的話mysql會生成一個隨機密碼 ./mysqld --defaults-file=/data/mysql/config/3307.conf --initialize-insecure
#之後再執行如下命令啟動
./mysqld --defaults-file=/data/mysql/config/3307.conf
?
-
可能有讀者在啟動mysql服務器的時候會報:error while loading shared libraries: libaio.so,運行如下命令安裝即可:
yum install libaio
-
連接3307主mysq服務器:
#進入mysql的bin目錄運行如下命令: #--socket的值就是我們在mysql配置文件中配置的socket值 ./mysql -uroot --socket=/data/mysql/sockets/3307.sock ? #同理連接3307的mysql服務器
-
執行如下命令查看master狀態並進行重置:
show master status;
reset master;
-
在主服務器上設置一個用戶用於從服務器從主服務器中復制數據時使用:
#創建用戶 create user ‘salve‘ identified by ‘666666‘; #賦予復制權限 GRANT REPLICATION SLAVE ON *.* TO ‘salve‘@‘%‘; ? #命令解釋 create user 用戶名 identified by ‘密碼‘; grant 權限 on 數據庫名.表名 to ‘用戶名‘@‘域名‘; ? *表示所有,*.*表示所有的數據庫和數據庫中的表 ‘%‘所有本地和遠程都可以 localhost 本地 ip地址 指定ip登錄
-
以上操作沒有問題之後,我們連接3307服務器進行從節點的配置:
#首先關閉 stop slave; #參數配置 change master to master_host=‘127.0.0.1‘, #主從服務的地址 master_port=3306, #主服務器的端口 master_user=‘slave‘, #用於從復制的用戶名,即第九步創建的 master_password=‘666666‘, #密碼 master_log_file=‘master-bin.000001‘, #主服務器的binlog日誌名稱,查看第八步 master_log_pos=597; #偏移量 #開啟 start slave;
至此我們的mysql主從架構已經搭建完成。小夥伴可以自行測試,在master節點寫入的數據是否會同步到slave節點.
總結:
-
一般主從架構從節點是不需要開啟binlog日誌的,首先因為從節點是只讀的開啟binlog日誌也沒用,因為binlog日誌記錄的是修改事件,其次從節點從relay-log中讀取主節點的修改事件時也不會將修改事件同步到自己的binlog中。因此從節點開啟binlog是沒有用。
-
雙主熱備的關鍵參數就是:log_salve_updates
-
雙主熱備其實就是兩臺mysql服務器互為主從關系。為了實現高可用,可以在兩臺互為主從關系的服務器下面再配置若幹個從節點。
-
關於reset master 和 reset slave語句的區別和註意事項:傳送門
註意:
-
設置mysql遠程訪問
#修改mysql 允許遠程訪問 use mysql; update user set host = ‘%‘ where user = ‘root‘;
-
如上操作,可能導致mysql的root用戶無初始密碼,按以下步驟解決:
#命令行連接mysql終端 ./bin/mysql -uroot --socket=/data/mysql3307/sockets/3307.sock #修改root的密碼 update mysql.user set authentication_string = password(‘123456‘) where user=‘root‘;
-
使用如下命令登錄終端
./bin/mysql -h192.168.1.2 -P3307 -uroot -p123456
-
二、mycat結合雙主復制實現讀寫分離模式
簡介:
應用程序僅需要連接mycat,後端服務器的讀寫分離由mycat進行控制,後端服務器數據的同步由MySQL主從同步進行控制。
鏈接:mycat結合雙主復制實現讀寫分離模式
mycat安裝
註意:
在安裝mycat之前首確定已經安裝了java
Mycat官網 下載Mycat安裝包:Mycat-server-1.6.6.1-release-20181031195535-linux.tar.gz
#解壓
tar -zxvf Mycat-server-1.6.6.1-release-20181031195535-linux.tar.gz
修改schema.xml
的配置文件
-
balance="1"
: 全部的readHost與stand by writeHost參與select語句的負載均衡。 -
writeType="0"
: 所有寫操作發送到配置的第一個writeHost,第一個掛了切到還生存的第二個 writeHost,重新啟動後以切換後的為準,切換記錄在配置文件中:dnindex.properties 。 -
switchType="1"
: 1 默認值,自動切換。
修改/conf/server.xml 和 /conf/schema.xml
server.xml修改內容如下
<user name="root" defaultAccount="true">
<property name="password">123456</property>
<property name="schemas">TESTDB,TESTDBT</property>
<!-- 表級 DML 權限設置 -->
<!--
<privileges check="false">
<schema name="TESTDB" dml="0110" >
<table name="tb01" dml="0000"></table>
<table name="tb02" dml="1111"></table>
</schema>
<schema name="TESTDBT" dml="0110" >
<table name="tb01" dml="0000"></table>
<table name="tb02" dml="1111"></table>
</schema>
</privileges>
-->
</user>
<user name="user">
<property name="password">user</property>
<property name="schemas">TESTDB,TESTDBT</property>
<property name="readOnly">true</property>
</user>
schema.xml內容如下
<?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/"> <schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1"> </schema> <schema name="TESTDBT" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn2"> </schema> <dataNode name="dn1" dataHost="node1" database="humy" /> <dataNode name="dn2" dataHost="node1" database="usemp" /> <dataHost name="node1" maxCon="10" minCon="5" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1"> <heartbeat>select user()</heartbeat> <writeHost host="master1" url="192.168.1.186:3307" user="root" password="123456"> <readHost host="slave2" url="192.168.1.186:3307" user="root" password="123456" /> </writeHost> <writeHost host="master2" url="192.168.1.186:3308" user="root" password="123456"> <readHost host="slave2" url="192.168.1.186:3308" user="root" password="123456" /> </writeHost> </dataHost> </mycat:schema>
啟動mycat服務
./bin/mycat start
啟動:./bin/mycat start
狀態: ./bin/mycat status
使用mysql的客戶端連接mycat
cd /data/app/mysql/ ./bin/mysql -uroot -p 8066 -h 192.168.1.186 ##連接mycat,初始密碼123456 mysql> show databases; +----------+ | DATABASE | +----------+ | TESTDB | | TESTDBT | +----------+ 2 rows in set (0.00 sec)
使用Navicat Premium連接mycat
通過mycat添加數據 可以實現配置中的數據庫的數據同步。
每次開機都要啟動mycat,網上看了好多都是用shell腳本來實現mycat開機自啟動,後來看到一種方法,直接修改系統文件來實現,已經實踐過,方法有效。
1.修改腳本文件rc.local:vim /etc/rc.d/rc.local
這個腳本是使用者自定的開機啟動程序,可以在裏面添加想在系統啟動之後執行的腳本或者腳本執行命令
2.添加如下內容:
export JAVA_HOME=/opt/jdk1.8.0_65
/usr/local/mycat/bin/mycat start
3.esc 退出編輯,:wq 保存修改
4.將rc.local修改為可執行
chmod 777 /etc/rc.d/rc.local
Mycat+Mysql主從復制實現雙機熱備