Kafka集群搭建及安全機制手冊
Mycat+Mysql的讀寫分離
前言:
在MySQL中間件出現之前,對於MySQL主從集群,如果要實現其讀寫分離,一般是在程序端實現,這樣就帶來一個問題,即數據庫和程序的耦合度太高,如果我數據庫的地址發生改變了,那麽我程序端也要進行相應的修改,如果數據庫不小心掛掉了,則同時也意味著程序的不可用,而這對很多應用來說,並不能接受。
在這裏,我用三個實例組成MySQL主從集群,來驗證MyCAT的讀寫分離功能。
環境:
- 虛擬機:virtualbox;鏡像:centos7; MyCAT;MySQL:5.6
- MySQL安裝:
- yum install wget
- wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm(下載mysql的repo源)
- sudo rpm -ivh mysql-community-release-el7-5.noarch.rpm
- sudo yum install mysql-server
- mysql -u root ,可以看到系統報錯,
- 解決授權:sudo chown -R root:root /var/lib/mysql
- 重啟服務:systemctl restart mysqld.service
- 修改mysql的密碼:set password for ‘root‘@‘localhost‘=password(‘root‘);
- GRANT ALL PRIVILEGES ON *.* TO ‘root‘@‘%‘ IDENTIFIED BY ‘root‘ WITH GRANT OPTION; 授權允許遠程登錄
- FLUSH PRIVILEGES;
- 退出mysql,重啟mysql;
- MyCAT安裝
- wget http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
- tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
- cp -r mycat /usr/local/mycat
- cd /usr/local/mycat/
- chmod +x *
- 配置環境變量
- vi /etc/profile
- 在文件添加一行:export MYCAT_HOME=/usr/local/mycat
- 使修改生效:source /etc/profile
- 測試是否生效:echo $MYCAT_HOME
- 安裝JDK,MyCAT依賴於JDK
- yum search java-1.7.0 yum install xxxxx
- 配置環境變量
- vim /etc/profile並添加:
- export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.141-2.6.10.1.el7_3.x86_64
- export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
- export PATH=$PATH:$JAVA_HOME/bin
- 使配置文件生效:source /etc/profile
- 測試:echo $JAVA_HOME
- 輸入命令:java -version
- 三臺虛擬服務器,MyCAT部署到其中一臺服務器上
- 分別實現 1.二主一從 2.一主二從
一主二從模式讀寫分離:
MyCAT :172.16.92.159 , Port:8066/9066
MySQL Master :172.16.92.159, Port:3306
MySQL Slave :172.16.92.151, Port:3306
MySQL Slave :172.16.92.152, Port:3306
MyCAT 8066:使用端口;9066:管理端口
主從復制實現步驟:
- 在主服務器上修改配置文件: vi /etc/my.cnf
[mysqld]
# my add
server-id=1(數據庫id號,註意唯一)
log-bin=mysql-bin(把更新的記錄寫到二進制文件中)
log-slave-updates(把更新的記錄寫到二進制文件中)
- 退出後重啟服務:systemctl restart mysqld.service
- 在從1服務器上修改配置文件: vi /etc/my.cnf
[mysqld]
# my add
server-id=2
relay-log=relay-bin(從主服務器讀並記錄到本地)
- 退出後重啟服務:systemctl restart mysqld.service
- 在從2服務器上修改配置文件: vi /etc/my.cnf
[mysqld]
# my add
server-id=3
relay-log=relay-bin(從主服務器讀並記錄到本地)
- 退出後重啟服務:systemctl restart mysqld.service
- 在主服務器上創建有復制權限的賬號
- grant replication slave on *.* to ‘slave‘@‘172.16.92.%‘ identified by ‘1234‘;
- 刷新權限:flush privileges;
- 在主服務器上查看狀態信息:
- [root@localhost ~]# mysql -u root -proot
- mysql > show master status;
- 分別在兩臺從服務器上連接主服務器
- [root@localhost ~]# mysql -u root -proot
- 如果之前配置過主從需要執行命令:stop slave;
- mysql> change master to master_host=‘172.16.92.159‘,master_user=‘slave‘,master_password=‘1234‘,master_log_file=‘mysql-bin.000043‘,master_log_pos=716;
- 解釋:host:master的ip地址;user:master上創建的賬戶;password:賬戶的密碼;其他要與master服務器查看的狀態匹配
- 開啟復制 : mysql> start slave;
- 查看slave狀態 : mysql> show slave status\G;
- 註意:Slave_IO_Running和 Slave_SQL_Running的狀態必須都為yes,如果不是,一般是兩個問題:防火墻沒有關閉,第三步輸入的不準確,需要回到第二步開始。
- 測試
- 在主服務器上創建表並插入數據
mysql> create table me(id int);
mysql> insert into me values(1);
- 在兩臺從服務器上查看,一主兩從復制完成。
MyCAT實現讀寫分離
配置:
- 配置文件非常多.如果只是簡單配置在不同的服務器上進行讀寫分離只需要配置兩個文件 server.xml 和 schema.xml
- A:進入conf目錄,修改schema.xml文件(本例沒有用到分片)
配置解析:
- schema:mycat的邏輯數據庫
- table:定義了 MyCat 中的邏輯表,所有需要拆分的表都需要在這個標簽中定義。
- name:定義邏輯表的表名,這個名字就如同我在數據庫中執行 create table 命令指定的名字一樣
- dataNode:該屬性的值需要和 dataNode 標簽中 name 屬性的值相互對應。
- dataNode:該屬性用於綁定邏輯庫到某個具體的 database 上
- dataHost:該屬性用於定義該分片屬於哪個數據庫實例的
- database 屬性:該屬性用於定義該分片屬性哪個具體數據庫實例上的具體庫
- dataHost :定義了具 體的數據庫實例、讀寫分離配置和心跳語句。
- name:唯一標識 dataHost 標簽,供上層的標簽使用。
- balance:屬性負載均衡類型,目前的取值有 4 種
- balance="0", 不開啟讀寫分離機制,所有讀操作都發送到當前可用的writeHost 上。
- balance="1",全部的 readHost 與 stand by writeHost 參與 select 語句的負載均衡,簡單的說,當雙主雙從模式(M1 ->S1 , M2->S2,並且 M1 與 M2 互為主備),正常情況下, M2,S1,S2 都參與 select 語句的負載均衡。
- balance="2",所有讀操作都隨機的在 writeHost、 readhost 上分發。
- balance="3", 所有讀請求隨機的分發到 wiriterHost 對應的 readhost 執行,writerHost 不負擔讀壓力,如果從服務器都掛了,過一段延遲之後,自動讀主服務器。註意 balance=3 只在 1.4 及其以後版本有, 1.3 沒有。
- writeType:負載均衡類型,目前的取值有 3 種
- writeType="0", 所有寫操作發送到配置的第一個 writeHost,第一個掛了切到還生存的第二個writeHost,重新啟動後已切換後的為準,切換記錄在配置文件中:dnindex.properties .
- writeType="1",所有寫操作都隨機的發送到配置的 writeHost。
- writeType=“2",沒實現。
- switchType
- -1 表示不自動切換
- 1 默認值,自動切換。
- 2 基於MySQL 主從同步的狀態決定是否切換 心跳語句為 show slave status
- 3 基於MySQLgalarycluster的切換機制(適合集群)(1.4.1)心跳語句為 show status like ‘wsrep%’
- 註意:實際環境不應該在slave進行寫操作。
- heartbeat :指明用於和後端數據庫進行心跳檢查的語句
- 主從切換的語句必須是:show slave status
- writeHost 標簽、readHost 標簽
- host:用於標識不同實例
- url :後端實例連接地址
- weight:權重 配置在 readhost 中作為讀節點的權重(1.4後)
常見坑位1:此配置在主機宕機後,msyql數據庫就癱瘓了。
解決:可以把其中一臺從機分配成writeHost,再第一個writeHost(主機)宕機後自動切換至第二個writeHost。
常見坑位2:此時出現了新的問題,讀數據可以,寫數據也可以。在把第一個wirteHost啟動後,新添加的數據並沒有保存到主機中而是報存到了第二個writeHost(從機中)。
解決:官網表示討論了很久,建議重新手工配置主從復制關系。原從配成現主,原主作為現從加入到集群中。
所以。下面介紹了雙主一從模式。(主從互為主備)
- B:進入conf目錄,修改server.xml文件
- 這裏的schema一定要和前面的schema.xml中的name對應
- 配置完畢後啟動mycat:[root@localhost conf]# ../bin/./mycat start
測試:
- [root@localhost conf]# mysql -u test -ptest -P8066 -h配置了mycat的ip,登錄成功說明配置成功,插入數據然後在別的機子上看是否一致。
- 如果其他服務器訪問失敗,記得要開放端口號
二主一從模式讀寫分離:(二臺主互為主從)
MyCAT :172.16.92.159 , Port:8066/9066
MySQL Master :172.16.92.159, Port:3306
MySQL Master :172.16.92.151, Port:3306
MySQL Slave :172.16.92.152, Port:3306
MyCAT 8066:使用端口;9066:管理端口
主從復制實現步驟:
- 在主1服務器上修改配置文件: vi /etc/my.cnf
[mysqld]
# my add
server-id=1(數據庫id號,註意唯一)
log-bin=mysql-bin(把更新的記錄寫到二進制文件中)
log-slave-updates(把更新的記錄寫到二進制文件中)
auto-increment-increment=2(自動增長的步長 解決多個主機自動增長出現重復問題)
auto-increment-offset=1(自動增長的起始數值 )
- 保存退出後重啟mysql服務
- 在主2服務器上修改配置文件: vi /etc/my.cnf
server-id=2
log-bin=mysql-bin
log-slave-updates
auto-increment-increment=2
auto-increment-offset=2
- 保存退出後重啟mysql服務
- 在從服務器上修改配置文件: vi /etc/my.cnf
[mysqld]
# my add
server-id=3
relay-log=relay-bin
- 保存退出後重啟mysql服務
- 在主1服務器上創建有復制權限的賬號
- mysql> grant replication slave on *.* to ‘user1‘@‘172.16.92.%‘ identified by ‘1234‘;
- 刷新權限:mysql> flush privileges;
- 在主1服務器上查看狀態信息
- mysql> show master status;
- 在主2服務器上連接主1服務器
- mysql> stop slave;
- mysql> change master to master_host=‘172.16.92.159‘,master_user=‘user1‘,master_password=‘1234‘,master_log_file=‘mysql-bin.000044‘,master_log_pos=418;
- 開啟復制 : mysql> start slave;
- 查看slave狀態 : mysql> show slave status\G;
- 註意:Slave_IO_Running和 Slave_SQL_Running的狀態必須都為yes,如果不是,一般是兩個問題:防火墻沒有關閉,第二步輸入的不準確。
- 在從服務器上連接主服務器
- [root@localhost ~]# mysql -u root -proot
- 如果之前配置過主從需要執行命令:stop slave;
- mysql> change master to master_host=‘172.16.92.159‘,master_user=‘user1‘,master_password=‘1234‘,master_log_file=‘mysql-bin.000044‘,master_log_pos=418;
- 解釋:host:master的ip地址;user:master上創建的賬戶;password:賬戶的密碼;其他要與master服務器查看的狀態匹配
- 開啟復制 : mysql> start slave;
- 查看slave狀態 : mysql> show slave status\G;
- 註意:Slave_IO_Running和 Slave_SQL_Running的狀態必須都為yes,如果不是,一般是兩個問題:防火墻沒有關閉,第三步輸入的不準確,需要回到第二步開始。
- 在主2服務器上創建有復制權限的賬號
- mysql> grant replication slave on *.* to ‘user2‘@‘172.16.92.%‘ identified by ‘1234‘;
- 刷新權限:mysql> flush privileges;
- 查看狀態信息:mysql> show master status;
- 在主2服務器上連接主1服務器
- mysql> stop slave;
- mysql> change master to master_host=‘172.16.92.159‘,master_user=‘user1‘,master_password=‘1234‘,master_log_file=‘mysql-bin.000044‘,master_log_pos=1014;
- 開啟復制 : mysql> start slave;
- 查看slave狀態 : mysql> show slave status\G;
- 註意:Slave_IO_Running和 Slave_SQL_Running的狀態必須都為yes,如果不是,一般是兩個問題:防火墻沒有關閉,第二步輸入的不準確。
- 至此,二主一從配置完成
- 測試:
- 分別在主1和主2修改數據,查看其他服務器數據是否一致
MyCAT實現讀寫分離
配置:
- 配置文件非常多.如果只是簡單配置在不同的服務器上進行讀寫分離只需要配置兩個文件 server.xml 和 schema.xml
- A:進入conf目錄,修改schema.xml文件
- B:修改server.xml文件
- C:重啟mycat
測試:
- [root@localhost conf]# mysql -u test -ptest -P8066 -h配置了mycat的ip,登錄成功說明配置成功,插入數據然後在別的機子上看是否一致。
補充:
本文配置的是寫在主機1,讀在從機,備用是主機2,如果主機1宕機,則自動使用主機2,讀寫都會存到主機2中。此時重啟主機1後,發現數據是一致的,這都歸功於mysql配置中的log-slave-updates屬性。
常見坑位3:使用Jmeter分別對mycat和mysql進行壓力測試的時候,mycat性能沒有mysql性能好。
解決:這是由於我搭建好MyCAT後,為了追蹤MyCAT讀寫的詳細信息,在conf/log4j2.xml設置為了debug模式。之後經過多次壓力測試實驗,再改為默認info模式後,性能會恢復。
Kafka集群搭建及安全機制手冊