Mysql數據庫集群及高並發(mycat)


MySQL數據庫集群和高並發 Mycat

MyCat簡介:
java編寫的數據庫中間件
運行環境需要JDK
是中間件,運行在代碼應用和Mysql數據庫之間的應用
前身:corba,是阿里開發的數據庫中間件,實現mysql數據庫分庫分表集群管理的中間件
使用mycat之后,編寫的所有SQL語句,必須嚴格遵守SQL標准規范
insert into table_name(column_name) values(column_value);
如圖:


應用----->mycat中間件------>數據庫1
------>數據庫2

MyCat術語簡介:
1.切分:
邏輯上的切分,在物理層面,是使用多庫(database),多表(table)實現的切分
1.1縱向切分:
注:假設數據庫test,將test切分為test1,test2....test1+test2...=test的數據總和
把一個數據庫切分成多個數據庫,配置方便,只能實現兩張表的表連接查詢
1.2橫向切分:
注:假設表test,共有20個字段,一個字段是主鍵pk,剩余19個字段,將他分為3張表test1:7;test2:8;test3:7,test1+test2+test3=22,因為他們都有一個相同的字段pk,所以總和多出兩個字段
把一個表切分成多個表,相比縱向切分配置麻煩,無法實現連接查詢
2.邏輯庫:
注:假設有邏輯庫s,那么他的數據可能是在物理中db1和db2中表現的,而s實際上並不存在
MyCat中定義的database是邏輯上存在的,但是物理上未必存在,主要是針對縱向切分提供的概念
2.1邏輯表:
注:邏輯表a,可能他的數據是表現在物理上的表a1,a2,a3...上的,實際上並不存在
MyCat中定義的table是邏輯上存在,物理上未必存在,主要是針對橫向切分提供的概念
3.默認端口:8066
4.數據主機--dataHost:
物理MySQL存放的主機地址,可以使用主機名,ip,域名定義
5.數據節點--dataNode:
注:物理上存在的database
物理的database是什么,數據保存的物理節點就是database
6.分片規則:
當控制數據的時候,如何訪問物理database和table
就是訪問dataHost和dataNode的算法
在Mycat處理器具體的數據CRUD的時候,如何訪問dataHost和dataNode的算法,如哈希算法,crc16算法等
Mysql:
主從備份:
就是一種主備模式的數據庫應用
主庫(master[Innodb:保證事務的高效性])數據與備庫(slave[MyISAM:保證讀取的高效性])數據完全一致
實現數據的多重備份,保證數據的安全。
可以在Master和Slave中使用不同的數據庫引擎,實現讀寫的分離
1.mysql5.5版本后本身支持主從備份
在老舊版的mysql中不支持主從備份,需要安裝額外的rpm包
如果需要安裝rpm,只能在一個位置節點安裝
2.主從備份的目的
2.1 實現主備模式:
保證數據的安全,盡量避免數據的丟失
2.2 實現讀寫分離:
使用不同的數據庫引擎,實現讀寫分離,提高所有的工作效率
InnoDB使用DML語法操作,MyISAM使用DQL語法操作
2.3 主從備份效果:
所有對Master的操作,都會同步到Slave中
如果Master和Slave天生上環境不同,那么對Master的操作可能會在Slave中出現錯誤
如:
在創建主從模式之前,Master有database:db1,db2,db3
Slave有database:db1,db2創建主從模式,現在的情況Masterhe
和slave天生不同
主從模式創建成功后,在master中drop database db3.Slave中拋出數據庫SQL異常,后續所有的命令不能同步
一旦出現錯誤,只能重新實現主從模式
3.主從備份配置:
主要操作Master和slave中的配置文件和DBMS的配置
配置文件:定義主從模式的基礎信息,如:日志,命令等
DBMS配置:提供主從訪問的用戶,基礎信息(Master和Slave的位置,用戶名,密碼,日志文件名等)等
建議:建立主從備份的mysql,最好原始環境一致,Database,table,data完全一致

3.1 Master主庫配置
/etc/my.cnf
>> cp /etc/mysql/my.cnf /etc/mysql/my.cnf.bak # 備份
>> cp /root/my.cnf /etc/mysql/my.cnf
>> vi /etc/mysql/my.cnf # 修改
1.server-id:
要求:MYSQL服務唯一標識,是數字,自然數,配置的時候有要求
2.單機使用:server-id任意配置,只要是數字即可
3.主從使用:server-id master標識數字必須小於slave唯一表示數字
3.2 開啟日志
本環境中的log_bin值:master_log
日志文件命名,開啟日志功能,記錄的是主庫中執行的所有SQL命令的
mysql的log_bin不是執行日志,狀態日志,是操作日志,就是在DBMS中所有的SQL命令,log_bin日志不是必要的,只有配置主從備份時才必要
3.2.1 日志文件配置:
變量的值就是日志文件名稱,是在日志文件名稱的主體
mysql數據庫自動增減文件名后綴和文件類型
>> service mysqld restart
>> mysql -uroot -p
# 創建用戶
在MySQL數據庫中為不存在的用戶授權就是同步創建用戶並授權,此用戶是從庫訪問使用的用戶
ip地址不能寫為%,因為主從備份中,當前創建的用戶,是給從庫slave訪問主庫
master使用的用戶必須有指定的訪問地址,不能是通用地址
~grant all privileges on *.* to 'slave'@'192.168.205.10' identified by 'slave' with grant option;
~flush privileges;
# 查看用戶
~use mysql;
~select user,host from user;
# 查看master信息
~show master status;
3.3 slave庫配置
修改salve配置:/etc/my.cnf
server_id :2
log_bin:可以使用默認值,也可以注釋掉
修改uuid:可選,主從模式要求多個MySQL物理名稱不能相同。即安裝
MySQL的過程中,linux自動生成的物理標志,唯一物理標志命名為uuid保存位置是MySQL數據庫的數據存放位置,默認為/var/lib/mysql目錄中,文件名是auto.cnf
修改auto.cnf文件中的uuid數據,隨意修改不建議改變數據長度,建議改變數據內容
/var/lib/mysql/auto.cnf
>>mysql -uroot -p
>>stop slave # 5.5以上都默認有slave功能但是他的默認
信息都是無效的信息
配置主庫信息:
需要修改的數據是依據master信息修改的,ip是master
所在物理機ip,用戶名和密碼是master提供的slave訪問用戶名和密碼
,日志文件是在master中查看的主庫信息提供的,在master中使用的命令show master status查看日志文件名稱
~change master to master_host='192.168.43.234', master_user='root'
,master_password='root',master_log_file=' master_log.master_log.000008';
~start slave;
~show slave status\G;

*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.43.234
Master_User: root
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master_log.000005
Read_Master_Log_Pos: 154
Relay_Log_File: wgw10-relay-bin.000002
Relay_Log_Pos: 335
Relay_Master_Log_File: master_log.000005
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0 # 最近一次錯誤的id
Last_Error: # 最近一次錯誤的基礎描述信息
Skip_Counter: 0 # 中斷了多少次
Exec_Master_Log_Pos: 154
Relay_Log_Space: 508
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0 # 最近一次io讀取錯誤的編號
Last_IO_Error: # 最近一次io讀取錯誤的描述
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
Master_UUID: 2f311669-a086-11e9-90d7-000c2990e912
Master_Info_File: /var/lib/mysql/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0

測試主從:
1.主從模式下的邏輯圖:
軟件應用 ====>master slave<--->IO操作/SQL操作<--io讀取日志內容/得到sql命令--->log_bin日志
2.測試:
master:
~ create database test charset=utf8;
~ use test;
~ create table test_t(id int auto_increment primary key, name varchar(32));
~ create table test_t(id int auto_increment primary key, name varchar(32));

slave:
~ show databases;
~ use test;
~ show tables;
~ desc test_t;
~ select * from test_t;

MyCat搭建:

1.安裝JDK
2.搭建主從備份(完成)
3.安裝mycat
Mycat-server-1.4-beta-20150604171601-linux.tar.gz
>> tar -zxf Mycat-server-1.4-beta-20150604171601-linux.tar.gz
>> cd mycat
>> mysql -uroot -p
~ grant all privileges on *.* to 'mycat'@'%' identified by 'mycat' with grant option;
~ flush privileges;
4.master提供可被mycat訪問的用戶
在mycat中通過master數據庫的root用戶訪問master數據庫
grant all privileges on *.* to 'root'@'%' identified by 'root' with grant option;
5.上傳mycat
6.解壓縮
7.mycat配置詳解:
mycat的所有配置文件都在conf目錄中
7.1 rule.xml
用於定義分片規則的配置文件
主要是查看,很少修改
mycat默認的分片規則:以500萬為單位,實現分片規則
邏輯庫A對應的dataNode-db1和db2.1-500萬保存在db1中,
501萬-1000萬保存在db2中,1001萬-1500萬保存在db1中,
依次類推
<tableRule name="auto-sharding-long">
<rule>
<columns>id</columns>
<algorithm>rang-long</algorithm>
</rule>
</tableRule>
crc32slot規則:在crud操作時,根據具體數據的crc32算法計算,數據應該保存在哪一個dataNode中,算法類似模運算
<tableRule name="crc32slot">
<rule>
<columns>id</columns>
<algorithm>crc32slot</algorithm>
</rule>
</tableRule>
7.2schema.xml
用於定義邏輯庫和邏輯表的配置文件,在配置文件中可以定義讀寫分離
,邏輯庫,邏輯表,dataHost,dataNode等信息
配置文件解釋:
7.2.1標簽schema:配置邏輯庫的標簽
7.2.2屬性name:邏輯庫名稱
7.2.3實行checkSQLschema:
是否檢測SQL語法中的schema信息,如
Mycat邏輯庫名稱A,dataNode名稱B
SQL:select * from A.table;
checkSQLschema值是true,Mycat發送到數據庫的SQL
是select * from table;
checkSQLschema值是false,發送的數據庫SQL是
select * from A.table;
7.2.4 sqlMaxLimit
Mycat在執行SQL的時候,如果sql語法中沒有limit子句,
避免一次行得到過多的數據,影響效率,limit子句的限制數量
默認為100,如果SQL中有具體的limit子句,當前屬性失效
SQL:select * from table.mycat
# 解析后:select * from table limit 100
SQL:select * from table limit 10.mycat
# 不做任何操作修改
7.2.5 標簽table:定義邏輯表的標簽,如果需要定義多個邏輯表,
編寫多個table標簽要求邏輯表的名和物理表(MYSQL數據庫中真是存在的表)的表名一致

7.2.6 屬性name:邏輯表名
7.2.7 屬性dataNode:
數據節點名稱,配置文件中后續需要定義的標簽(即物理數據庫中的database名稱),多個名稱
使用逗號分隔,多個database定義后,代表分庫
7.2.8 屬性rule:
分片規則名稱,具體的規則名稱參考rule.xml配置文件
sql語句發送到mysql中后,mysql如何計算,應該將當前的sql發送到哪一個物理數據庫管理系統或物理database中
7.2.9 標簽dataNode:
定義數據節點的標簽,定義具體的物理database信息的
7.2.10 屬性name:
數據節點名稱,是定義的邏輯名稱,對應具體的物理數據庫database
7.2.11 屬性dataHost:
引用dataHost標簽的name值,代表使用的物理數據庫所在位置和配置信息
7.2.12 屬性database:
在dataHost物理機中,具體的物理數據庫database名稱
7.2.13 dataHost標簽:
定義數據主機的標簽,就是物理MYSQL真實安裝的位置
7.2.14 屬性name:
數據節點名稱,是定義的邏輯名稱,對應具體的物理數據庫database
7.2.15 屬性maxcon/mincon:
最大/最小連接數
7.2.16 屬性dbType:
數據庫類型:mysql數據庫
7.2.17 屬性dbDriver:
數據庫驅動類型,native,使用mycat提供的本地驅動
7.2.18 dataHost子標簽writeHost:
寫數據的數據庫定義標簽,實現讀寫分離操作
7.2.19 屬性host
數據庫命名
7.2.20 屬性url
數據庫訪問路徑
7.2.21 heartbeat
7.3 server.xml
配置mycat的對外服務策略

啟動mycat:
bin/mycat start
停止命令:
bin/mycat stop
重啟命令:
bin/mycat restart
查看mycat狀態:
bin/mycat status
jps
訪問方式:
命令行或者客戶端
連接成功后,因為mycat只能訪問mysqlde schema(database),
)不能自動創建邏輯庫對應的物理層,且不能創建邏輯表對應的物理表
必須人工連接master數據庫,手動創建database,
表格可以在mycat控制台創建,注意,在mycat控制台創建的表
,必須是schema.xml配置文件中定義過的邏輯表
命令行訪問:
mysql -u 用戶名 -p 密碼 -hmycat 主機 IP -P8066
mysql -uroot -p123456 -h192.168.43.2 -P8066
連接成功后,可以當作MYSQL數據庫使用
1.表約束
不能創建圍在schema.xml中配置的邏輯表
不能創建
2.DML約束
尤其是新增:必須在insert into 語法后攜帶所有的字段名稱,
至少攜帶主鍵名稱,因為分片規則絕大多數是通過主鍵字段計算數據分派你規則的
查看Mycat日志:

分庫配置:
/mycat/conf/schemal.xml # 配置邏輯庫和邏輯表(和物理庫和物理表的對應關系)

/mycat/conf/server.xml # port ,用戶驗證,用戶授權

 

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">

<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
<table name="t_user" dataNode="dn1,dn2,dn3" rule="mod-long" />
</schema>
<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataNode name="dn2" dataHost="localhost1" database="db2" />
<dataNode name="dn3" dataHost="localhost1" database="db3" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.43.234:3306" user="root"
password="root" />
</dataHost>
</mycat:schema>

/mycat/conf/server.xml
"""
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://org.opencloudb/">
<system>
<property name="serverPort">8806</property><!--mycat服務端口號-->
<property name="managerPort">9066</property><!--Mycat管理端口號-->
<user name="root"><!--mycat用戶名-->
<property name="password">密碼</property>
<property name="schemas">用戶可訪問的邏輯庫名,如果有多個邏輯庫用逗號分隔</property>
<!--表級DML權限設置-->
<!--不檢查權限
<privileges check="false">
<schema name="邏輯庫名" dml="0110">
<table name="邏輯表名" dml="0000"></table>
<table name="tb02" dml="1111"></table>
</schema>
<privileges>
-->
</user>

<user name="user"><!--其他用戶名-->
<property name="password">密碼</property>
<property name="schemas">可訪問邏輯庫名</property>
<property name="readOnly">是否只讀</property>
</user>
</mycat:server>
"""
示例:
<user name="root">
<property name="password">123456</property>
<property name="schemas">TESTDB</property>
</user>

<user name="user">
<property name="password">user</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">true</property>
</user>


>> /bin/mycat start
>> /bin/mycat status
>> /bin/mycat console # 如果出錯的話查看錯誤原因
>> mysql -uroot -p123456 -h192.168.43.2 -P8066 #此時對於數據表不能做任何操作,需要添加真實的物理庫,物理表
>> mysql -uroot -p
~show databases;
~create database db1 charset utf8;
~create database db1 charset utf8;
~create database db1 charset utf8;

# 測試mycat
----創建表格t_user
create table t_user(
id int not null,
name varchar(32),
password varchar(32),
age int(3),
primary key (id)
);
-----測試表格數據存儲,
# coding:utf8
import MySQLdb

def test(num):

db = MySQLdb.connect(host="192.168.43.2",port=8066,passwd="123456",db="TESTDB",charset="utf8")
cursor = db.cursor()
for i in range(1000000):
num += i
cursor.execute("insert into t_user(id,name,password,age) values(%d,'a','a',20);"%num)
db.commit()
db.close()

if __name__ == "__main__":
num = 497524
test(num)
MyCat讀寫分離:

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">

<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
<table name="t_user" dataNode="dn1,dn2,dn3" rule="mod-long" />
</schema>
<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataNode name="dn2" dataHost="localhost1" database="db2" />
<dataNode name="dn3" dataHost="localhost1" database="db3" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.43.2:3306" user="root" password="root">
# 讀寫分離
<readHost host="hostS1" url="192.168.43.1:3306" user="root" password="root" />
</writeHost>
</dataHost>
</mycat:schema>
Mycat管理MySQL集群配置和負載均衡配置
所有的集群配置,都必須配置多主多從模式。即多個master節點相互之間配置主從,
如:master1和slave1為第一組主從,master2和slave2為第二組主從,master1和
master2互為對方的主從

注:此方案缺陷可能有IO延遲問題
master1<-----互為主從----->master2
^ ^
| |
| |
| |
主從 主從
| |
| |
slave1 slave2
注意:crc32slot分片規則,在使用的時候要求必須先設置好分片規則,在啟動mycat,
如果先啟動了mycat,在設置分片規則,會導致分片規則失效,需要刪除conf目錄中的ruledata子目錄。ruledata目錄中會記錄crc32slot的分片節點,日治文件命名
規則為crc32slot_表名
balance="1" # 代表寫操作走writeHost,讀操作走readHost
writeType="0" # 代表如何寫,等於零代表以第一個節點為主,當第一個節點宕機自動跳轉到第二個節點

switchType="1" # 代表選擇的策略
slaveThreshold="100"

數據庫負載均衡策略:
第一種配置方案:
即上面的方案
balance:
0: 不開啟讀寫分離機制,所有讀操作都發送到當前可用的writeHost上
1:全部的readHost與stand by writeHost參與select語句的負載均衡(常用)
2:所有讀操作都隨機的在writeHost,readHost上分發
3:所有讀請求隨機的分發到writeHost對應的readHost執行writeHost不負擔讀壓力
writeType:
0:所有寫操作發送到配置的第一個writeHost,第一個掛了,切換到還生存的第二個writeHost,重新啟動后以切換后的為准,切換記錄在配置文件中:dnindex.properties(datanode index)
1:所有寫操作都隨機的發送到配置的writeHost。1.5以后廢棄不推薦
switchType:
也涉及到讀寫分離問題,可以解決IO延遲問題
-1:表示不自動切換:如M1宕機會一直卡死不會切換到M2
1:默認值,表示自動切換
2:基於mysql主從同步的狀態決定是否切換讀寫主機,心跳語句為:show slave status,當心跳檢測獲取的數據發現了IO的延遲則讀操作自動定位到writeHost中。如果心跳檢測獲取的數據沒有IO延遲,則讀操作自動定位到readHost中。建議為不同的表格定位不同的dataHost節點。
第二種配置方案:

<table name="t_user" dataNode="dn1,dn2,dn3" rule="crc32slot"/>
<table name="t_user" dataNode="dn1,dn2,dn3" rule="crc32slot"/>

<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataNode name="dn2" dataHost="localhost1" database="db2" />
<dataNode name="dn3" dataHost="localhost1" database="db3" />
<dataNode name="dn4" dataHost="localhost2" database="db4" />
<dataNode name="dn5" dataHost="localhost2" database="db5" />
<dataNode name="dn6" dataHost="localhost2" database="db6" />

 

<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="2" slaveThreshold="100">
<heartbeat>show slave staus</heartbeat>
# 這里沒有readHost,主從是根據心跳檢測來決定的
<writeHost host="hostM1" url="192.168.43.1:3306" user="root" password="root"/>
<writeHost host="hostsS1" url="192.168.43.2:3306" user="root" password="root"/>
</dataHost>


<dataHost name="localhost2" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="2" slaveThreshold="100">
<heartbeat>show slave staus</heartbeat>
<writeHost host="hostM2" url="192.168.43.3:3306" user="root" password="root"/>
<writeHost host="hostS2" url="192.168.43.4:3306" user="root" password="root"/>
</dataHost>

Haproxy+Keepalived+MyCat+MySQL實現高可用集群:

主機分配:
master1/mycat1 -192.168.199.184
slave1/mycat2 - 192.168.199.116

master2 - 192.168.199.212
slave2 - 192.168.199.157

haproxy1 - 192.168.199.157
haproxy2 - 192.168.199.102

VIP - 192.168.199.190


應用版本:
Haproxy:haproxy-1.7.1.tar.gz
Keepalived:keepalived-1.2.18.tar.gz
Mycat:Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz

結構圖:
參考結構圖

搭建步驟:
1.配置MyCat狀態檢查服務:
在所有MyCat(192.168.199.184/192.168.199.116)服務所在主句中增加狀態檢查服務腳本。此操作為Haproxy提供對Mycat服務狀態檢查的依據。本案例中使用xinetd實現。通過xinetd,HaProxy可以用httpchk來檢測MyCat的存活狀態。(xinetd即extended internet daemon。xinetd是新一代的網絡守護進程服務程序,又叫做超級Internet服務器。經常用來管理多種輕量級Internet服務,xinetd提供類似於inetd+tcp_wrapper的功能,但是更加強大和安全。xinetd為linux系統的基礎服務)
1.1 安裝xinetd
yum install -y xinetd
1.2 添加includedir/etc/xinetd.d
檢查/etc/xinetd.conf的末尾是否有includedir /etc/xinetd.d。沒有就加上
1.3 創建/etc/xinetd.d 目錄
vi /etc/xinetd.d/mycat_status
1.4 增加Mycat存活狀態檢測服務配置
添加以下內容:
service mycat_status
{
flags = REUSE
## 使用該標記的socket_type為stream,需要設置wait為no
socker_type=stream ## 封包處理方式,Stream為TCP數據包
port=48700##服務監聽端口
wait=no ## 表示不許等待,即服務將以多線程的方式運行
user=root ## 執行此服務進程的用戶
server=/usr/local/bin/mycat_status ## 需要啟動的服務腳本
log_on_failure += USERID ## 登錄失敗記錄的內容
disable = no ## 要啟動的服務,將此參數設置為no
}
1.5添加 /usr/local/bin/mycat_status服務腳本
# !/bin/bash
Mycat = '/root/upload/mycat/bin/mycat status | grep 'not running'| wc -l'
if ["$Mycat"="0"];then
/bin/echo -e "HTTP/1.1 200 OK\r\n"
else
/bin/echo -e "HTTP/1.1 503 Service Unavailable\r\n"
fi
1.6給新增腳本賦予可執行權限
chmod 755 /usr/local/bin/mycat_status
1.7在/etc/services中加入mycat_status服務
vi /etc/services
在末尾加入:
mycat_status 48700/tcp # mycat_status

重啟xinetd服務:
service xinetd restart
netstat -antup|grep 48700
1.8 測試腳本是否有效
/usr/local/bin/mycat_status
2.安裝HAProxy:
注:安裝在haproxy1 和 haproxy2兩個節點主機中
2.1上傳haproxy-1.7.1.tar.gz到Linux並解壓安裝包
tar -zxf haproxy-1.7.1.tar.gz
2.2安裝編譯依賴
yum install -y gcc-c++ pcre-devel zlib zlib-devel openssl openssl-devel
2.3編譯:
>> cd haproxy-1.7.1
>> make TARGET=linux2628 ARCH=x86_64 USE_PCRE=1 USE_OPENSSL=1
USE_ZLIB=1 PREFIX=/usr/local/haproxy
注意:TARGET是指內核版本,高於2.6.28的建議設置為linux2628,Linux操作系統內核版本查看命令為#uname -r,ARCH指定系統架構,openssl pcre zlib 這三個包需要安裝不然不支持
2.4 創建安裝目錄
mkdir /usr/local/haproxy
2.5 執行安裝
make install PREFIX=/usr/local/haproxy
2.6創建配置文件目錄:
mkdir -p /usr/local/haproxy/conf
mkdir -p /etc/haproxy
2.7 添加配置文件並創建軟連接
ln -s /usr/local/haproxy/conf/haproxy.cfg /etc/haproxy/haproxy.cfg
vi /usr/local/haproxy/conf/haproxy.cfg
# 官方配置文件解釋為/usr/local/haproxy/configuration.txt
先跳過后面配置
2.8 拷貝錯誤頁面資源並創建軟連接
cp -r /root/upload/haproxy-1.7.1/examples/errorfiles /usr/local/haproxy/
ln -s /usr/local/haproxy/errorfiles /etc/haproxy/errorfiles
2.9 拷貝開機啟動文件,並賦予權限
cp /root/upload/haproxy-1.7.1/examples/haproxy.init /etc/rc.d/init.d/haproxy
chmod +x /etc/rc.d/init.d/haproxy
3.0 添加HAproxy 命令腳本軟連接
ln -s /usr/local/haproxy/sbin/haproxy /usr/sbin
3.1 設置HAProxy開機啟動
chkconfig --add haproxy
chkconfig haproxy on
HAProxy配置MyCat負載均衡集群
1.修改配置文件haproxy.cfg
1.1 192.168.199.157 -haproxy1 服務器配置
vi /usr/local/haproxy/conf/haproxy.cfg

注:haproxy1和haproxy2都要配置
2.為haproxy添加linux系統用戶
groupadd haproxy
useradd -g haproxy haproxy
2.1 創建chroot運行的路徑
mkdir /usr/share/haproxy
2.2開啟rsyslog的haproxy日志記錄功能
默認情況下,haproxy是不記錄日志的,如果需要記錄日志,還需要配置
系統的syslog,在linux系統中是rsylog服務。syslog服務器可以用作一個網絡中的日志監控中心,rsylog是一個開源工具,被廣泛用於linux系統以通過tcp/ucp協議轉發或接收日志消息。安裝配置rsylog服務:
yum install -y rsyslog ## 沒安裝的情況下執行安裝
vi /etc/rsyslog.conf
把$ModLoad imdup 和 $UDPServerRun 514 前面的 # 去掉
$ModLoad imdup ##是模塊名,支持UDP協議
$UDPServerRun 514 ## 允許514端口接收使用UDP和TCP協議轉發過來的日志,
##而rsyslog在默認情況下,正是在514端口監聽UDP
確認 ####GLOBAL DIRECTIVES####段中是否有 #IncludeConfig /etc/rsyslog.d/*.conf沒有則加上

rsyslog服務會來此

cd /etc/rsyslog.d/
創建haproxy的日志配置文件
vi /etc/rsyslog.d/haproxy.conf
local0.* /var/log/haproxy.log

&~
注意如果不加上上面的“&~”配置則除了在/var/log/haproxy.log中寫入日志外,也會寫入/var/log/message文件中


配置保存后重啟rsylog服務
service rsyslog restart
等到HAProxy服務啟動后,就能在/var/log/haproxy.log中看到日志了

2.3配置系統內核IP包轉發規則
vi /etc/sysctl.conf
修改如下內容:
net.ipv4.ip_forward=1
是配置生效
sysctl -p
2.4啟動haproxy
service iptables stop # 關閉防火牆
service haproxy start
ps -ef|grep haproxy
2.5查看haproxy提供的web統計應用
http://192.168.199.157:48800/admin-status
http://192.168.199.102:48800/admin-status
用戶名和密碼都是admin,參考/usr/local/haproxy/conf/haproxy.cfg配置文件
注意:安裝一個Haproxy之后,可以通過mysql命令控制台直接測試訪問HAProxy。命令:mysql -uroot -p123456 -h192.168.199.157 -P3307
3.安裝Keepalived

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM