1. 程式人生 > >Mycat+Mysql主從複製+haproxy+keepalived實現高可用的分庫分表叢集方案

Mycat+Mysql主從複製+haproxy+keepalived實現高可用的分庫分表叢集方案

一, 部署架構

1.1架構圖

這裡寫圖片描述

1.2 軟體版本

作業系統: CentOS2-7-X86_64-DVD-1708.iso
JDK 版本: jdk1.8.0_11
Keepalived 版本: keepalived-1.2.18.tar.gz
HAProxy 版本: haproxy-1.5.16.tar.gz
MyCat 版本: Mycat-server-1.4-release-20151019230038-linux.tar.gz
MySQL 版本: mysql-5.6.26.tar.gz

二,Mysql原始碼編譯安裝

2.1安裝環境:

作業系統:CentOS2-7-x86_64-DVD-1708.iso
Mysql 版本:mysql-5.6.26.tar.gz

2.2原始碼安裝mysql5.6.26

1) 使用下面的命令檢查是否安裝有 MySQL Server:

rpm -qa | grep mysql

mysql-libs-5.1.73-3.el6_5.x86_64
如果是 CentOS7 以上, 請使用以下命令檢視:

rpm -qa | grep mariadb

mariadb-libs-5.5.41-2.el7_0.x86_64
(因為沒有 MySQL 服務,因此沒必要解除安裝。 mysql-libs 是 MySQL 的必要包)
(如果有的話可通過下面的命令來解除安裝掉, rpm -e mysql //普通刪除模式)

2) 改防火牆設定,開啟 3306 埠:

vi /etc/sysconfig/iptables

增加如下行:

-A INPUT -p tcp -m state –state NEW -m tcp –dport 3306 -j ACCEPT

重啟防火牆:

service iptables restart

3) 新增 mysql 使用者組:

groupadd mysql

4) 新增 mysql 使用者, 並新增到 mysql 使用者組:

useradd -r -g mysql mysql

5) 新建 MySQL 執行檔案目錄(後面會把編譯好的 mysql 程式安裝到這個目錄):

 mkdir -p /usr/local/mysql

6) 新建 MySQL 資料庫資料檔案目錄:

mkdir -p /home/mysql/data
mkdir -p /home/mysql/logs
mkdir -p /home/mysql/temp

(注意:上面的 logs 及 temp 目錄是為了以後將 MySQL 的資料檔案與執行程式檔案分離,如果打算設定到不同的路徑,注意修改對應的執行命令和資料庫初始化指令碼)

7) 增加 PATH 環境變數搜尋路徑:

vi /etc/profile

在 profile 檔案末尾增加兩行
mysql env param

PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH export PATH

使 PATH 搜尋路徑立即生效:

source /etc/profile

8) 安裝編譯 MySQL 需要的依賴包:

 yum install make cmake gcc gcc-c++ bison bison-devel ncurses ncurses-devel autoconf
automake

9) 進入/usr/local/src 目錄,上傳 mysql-5.6.26.tar.gz 原始碼到/usr/local/src 目錄:

# cd /usr/local/src

10) 開始編譯安裝 mysql-5.6.26

tar -zxvf mysql-5.6.26.tar.gz

進入解壓縮原始碼目錄:

# cd mysql-5.6.26

使用 cmake 原始碼安裝 mysql(如果打算安裝到不同的路徑,注意修改下面語句中/usr/local/mysql 和/home/mysql/data 路徑!)

# cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_MEMORY_STORAGE_ENGINE=1 \
-DWITH_READLINE=1 \
-DENABLED_LOCAL_INFILE=1 \
-DMYSQL_DATADIR=/home/mysql/data \
-DMYSQL_USER=mysql \
-DMYSQL_TCP_PORT=3306 \
-DENABLE_DOWNLOADS=1

上面的這些複製完,回車,然後就開始 cmake 的過程,一般時間不會很長
配置解釋:
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql 設定安裝目錄
-DMYSQL_DATADIR=/home/mysql/data 設定資料庫存放目錄
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock 設定 UNIX socket 目錄
-DMYSQL_USER=mysql 設定執行使用者
-DDEFAULT_CHARSET=utf8 設定預設字符集,預設 latin1
-DEFAULT_COLLATION=utf8_general_ci設定預設校對規則,預設 latin1_general_ci
-DWITH_INNOBASE_STORAGE_ENGINE=1 新增 InnoDB 引擎支援
-DENABLE_DOWNLOADS=1 自動下載可選檔案, 比如自動下載谷歌的測試包
-DMYSQL_TCP_PORT=3306 設定伺服器監聽埠,預設 3306
-DSYSCONFDIR=/etc 設定 my.cnf 所在目錄,預設為安裝目錄)

執行過程中會出現:
CMake Error: Problem with tar_extract_all(): Invalid argument
Cmake Error:Problem extracting tar:/usr/local/src/mysql5.6.26/source_downloads/gmoc k-1.6.0.zip
解決方法:
cd mysql 目錄下面會發現有一個 source_downloads 目錄,需要解壓 unzip gmock-1.6.0.zip,然後再重新執行上述配置過程。也可以去掉-DENABLE_DOWNLOADS=1 這個選項,不編譯谷歌的測試包也沒有什麼問題,但是之前的某些版本會出現無法編譯的問題

11) cmake 結束後開始編譯原始碼,這一步時間會較長,請耐心等待:

# make

12) 安裝編譯好的程式:

# make install

(注意:如果需要重灌 mysql,在/usr/local/src/mysql-5.6.26 在執行下 make install 就可以了,不需要再 cmake 和 make)

13) 清除安裝臨時檔案:

# make clean

14) 修改 mysql 目錄擁有者為 mysql 使用者

# chown -Rf mysql:mysql /usr/local/mysql
# chown -Rf mysql:mysql /home/mysql

15) 進入 mysql 執行程式的安裝路徑:

# cd /usr/local/mysql

16) 執行初始化配置指令碼,建立系統自帶的資料庫和表(注意:路徑/home/mysql/data 需要換成自定定義的資料庫存放路徑):

# scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/home/mysql/data

17) 初始化指令碼在/usr/local/mysql/下生成了配置檔案 my.cnf,需要更改該配置檔案的所有者:

# chown -Rf mysql:mysql /etc/my.cnf

18) 編輯/etc/my.cnf(建議將配置檔案放到此c處,相關引數酌情進行優化配置)

[client]

port = 3306
socket = /usr/local/mysql/mysql.sock
[mysqld]
character-set-server = utf8
collation-server = utf8_general_ci
log_bin_trust_function_creators=true
lower_case_table_names=1
skip-external-locking
skip-name-resolve
user = mysql
port = 3306
basedir = /usr/local/mysql
datadir = /home/mysql/data
tmpdir = /home/mysql/temp
# server_id = .....
socket = /usr/local/mysql/mysql.sock
log-error = /home/mysql/logs/mysql_error.log
pid-file = /home/mysql/mysql.pid
open_files_limit = 10240
back_log = 600
max_connections=500
max_connect_errors = 6000
wait_timeout=605800
#open_tables = 600
#table_cache = 650
#opened_tables = 630
max_allowed_packet = 32M
sort_buffer_size = 4M
join_buffer_size = 4M
thread_cache_size = 300query_cache_type = 1
query_cache_size = 256M
query_cache_limit = 2M
query_cache_min_res_unit = 16k
tmp_table_size = 256M
max_heap_table_size = 256M
key_buffer_size = 256M
read_buffer_size = 1M
read_rnd_buffer_size = 16M
bulk_insert_buffer_size = 64M
lower_case_table_names=1
default-storage-engine = INNODB
innodb_buffer_pool_size = 2G
innodb_log_buffer_size = 32M
innodb_log_file_size = 128M
innodb_flush_method = O_DIRECT
#####################
thread_concurrency = 32
long_query_time= 2
slow-query-log = on
slow-query-log-file = /home/mysql/logs/mysql-slow.log
[mysqldump]
quick
max_allowed_packet = 32M
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

19)複製服務啟動指令碼:

# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql

20)啟動mysql服務:

# service mysql start

Starting MySQL.. SUCCESS!

21)設定 MySQL 開機自動啟動服務:

# chkconfig mysql on

22)設定 MySQL 資料庫 root 使用者的本地登入密碼(初始使用者沒有密碼):

# mysqladmin -u root password ‘111111’

23)允許root使用者遠端連線(根據實際情況進行操作)

# mysql -uroot -p111111
mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '111111' WITH
GRANT OPTION;
mysql> flush privileges;
mysql> exit;

24)執行安全設定指令碼(可選操作)

# /usr/local/mysql/bin/mysql_secure_installation
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL
SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!
In order to log into MySQL to secure it, we'll need the current
password for the root user. If you've just installed MySQL, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.
Enter current password for root (enter for none): ----->此處輸入 root 密碼
OK, successfully used password, moving on...
Setting the root password ensures that nobody can log into the MySQL
root user without the proper authorisation.
    You already have a root password set, so you can safely answer 'n'.
Change the root password? [Y/n] n -----> 上已為 root 設定了密碼,此處可輸 n
... skipping.
    By default, a MySQL installation has an anonymous user, allowing anyone
to log into MySQL without having to have a user account created for
them. This is intended only for testing, and to make the installation
go a bit smoother. You should remove them before moving into a
production environment.
    Remove anonymous users? [Y/n] Y ------> 刪除匿名使用者
... Success!
Normally, root should only be allowed to connect from 'localhost'. This
ensures that someone cannot guess at the root password from the network.
Disallow root login remotely? [Y/n] n -----> 一般不允許 root 遠端登入,可新增普通使用者,
然後設定允許遠端登入
... skipping.
By default, MySQL comes with a database named 'test' that anyone can
access. This is also intended only for testing, and should be removed
before moving into a production environment.
Remove test database and access to it? [Y/n] Y -----> 刪除 test 庫及相應許可權
- Dropping test database...
... Success!
- Removing privileges on test database...
... Success!
Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.
Reload privilege tables now? [Y/n] Y -----> 重新載入許可權表使設定生效
... Success!
All done! If you've completed all of the above steps, your MySQL
installation should now be secure.
Thanks for using MySQL!
Cleaning up...

25)重啟伺服器,檢測 mysql 是否能開機自動啟動:

# reboot

三,Mysql主從複製配置(基於bin-log)

3.1 配置注意事項

 主從伺服器作業系統版本和位數一致
 兩臺資料庫伺服器的的 selinux 都要 disable(永久關閉 selinux, 請修改/etc/selinux/config,將 SELINUX 改為 disabled)
 Master和Slave資料庫的版本要一致
 Master和Slave資料庫中資料要一致
 Master開啟二進位制日誌,Master和Slave的server_id在區域網內必須唯一

3.2 Master上的配置

3.2.1修改 Master 的配置檔案/etc/my.cnf

vi /etc/my.cnf
## 在 [mysqld] 中增加以下配置項
## 設定 server_id,一般設定為 IP
server_id=170
## 複製過濾: 需要備份的資料庫, 輸出 binlog
binlog-do-db=iuim 
## 開啟二進位制日誌功能, 可以隨便取, 最好有含義
log-bin=iuim_mysql_bin_log
## 為每個 session 分配的記憶體,在事務過程中用來儲存二進位制日誌的快取
binlog_cache_size=1M
## 主從複製的格式(mixed,statement,row,預設格式是 statement)
binlog_format=mixed
## 二進位制日誌自動刪除/過期的天數。預設值為 0,表示不自動刪除。
expire_logs_days=7
## 跳過主從複製中遇到的所有錯誤或指定型別的錯誤,避免 slave 端複製中斷。
## 如: 1062 錯誤是指一些主鍵重複, 1032 錯誤是因為主從資料庫資料不一致
slave_skip_errors=1062

3.2.2 啟動/重啟 Master 資料庫服務,登入資料庫, 建立資料同步使用者,並授予相應的許可權

    # service mysql restart
Shutting down MySQL..[ OK ]
Starting MySQL..[ OK ]
    # mysql -uroot -p111111

mysql> grant replication slave, replication client on *.* to ‘${user}’@${slaveIp} identified by
‘${password}’;
Query OK, 0 rows affected (0.00 sec)
## 重新整理授權表資訊
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
## 檢視 position 號, 記下 position 號(從機上需要用到這個 position 號和現在的日誌檔案)
mysql> show master status;
![這裡寫圖片描述](https://img-blog.csdn.net/20180605204737164?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2poc2ZqYQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

3.3 Slave上的配置

3.3.1修改mysql配置檔案

vi /etc/my.cnf

## 在 [mysqld] 中增加以下配置項
## 設定 server_id,一般設定為 IP
server_id=173
## 複製過濾: 需要備份的資料庫,輸出 binlog
binlog-do-db=iuim
## 開啟二進位制日誌,以備 Slave 作為其它 Slave 的 Master 時使用
log-bin=iuim-mysql-slave1-bin
## 為每個 session 分配的記憶體,在事務過程中用來儲存二進位制日誌的快取
binlog_cache_size = 1M
## 主從複製的格式(mixed,statement,row,預設格式是 statement)
binlog_format=mixed
## 二進位制日誌自動刪除/過期的天數。預設值為 0,表示不自動刪除。
expire_logs_days=7
## 跳過主從複製中遇到的所有錯誤或指定型別的錯誤,避免 slave 端複製中斷。
## 如: 1062 錯誤是指一些主鍵重複, 1032 錯誤是因為主從資料庫資料不一致
slave_skip_errors=1062
## relay_log 配置中繼日誌(與主節點中配置的log-bin屬性相同)
relay_log= iuim_mysql_bin_log
## log_slave_updates 表示 slave 將複製事件寫進自己的二進位制日誌
log_slave_updates=1
3.3.2儲存後重啟 MySQL 服務,還原備份資料
# service mysql restart
Shutting down MySQL..[ OK ]
Starting MySQL..[ OK ]

3.3.3將初始化sql指令碼在master和slave上都執行一次

3.3.4登入 Slave 資料庫, 新增相關引數

#mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.6.26-log Source distribution
Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> change master to master_host='192.168.2.170', master_user='${slaveUser}',
master_password='${password}', master_port=3306, master_log_file='iuim-mysql-bin-log.000001',
master_log_pos=435, master_connect_retry=30;
Query OK, 0 rows affected, 2 warnings (0.01 sec)
上面執行的命令的解釋:
master_host='192.168.2.170' ## Master 的 IP 地址
master_user='${slaveUser}' ## 用於同步資料的使用者(在 Master 中授權的使用者)
master_password='${password}' ## 同步資料使用者的密碼
master_port=3306 ## Master 資料庫服務的埠
master_log_file='iuim-mysql-bin-log.000001' ##指定 Slave 從哪個日誌檔案開始讀複製資料(可在 Master 上使用 show master status 檢視到日誌檔名)
master_log_pos=435## 從哪個 POSITION 號開始讀
master_connect_retry=30 ##當重新建立主從連線時,如果連線建立失敗,間隔多久後重試。單位為秒, 預設設定為 60 秒, 同步延遲調優引數。

## 檢視主從同步狀態
mysql> show slave status\G;
![這裡寫圖片描述](https://img-blog.csdn.net/20180605204921429?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2poc2ZqYQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
可看到 Slave_IO_State 為空, Slave_IO_Running 和 Slave_SQL_Running 是 No, 表明 此時Slave 還沒有開始複製過程。

開啟主從同步

mysql> start slave;
Query OK, 0 rows affected (0.00 sec) ## 再檢視主從同步狀態
mysql> show slave status\G;
這裡寫圖片描述

至此,mysql主從複製配置完成,在master上對iuim庫的操作會自動同步到salve上

四, Mycat在Mysql主從複製基礎上實現讀寫分離

1,安裝要求

Mycat是基於java開發的,首先確報已經安裝了jdk1.7或以上版本的jdk,

2,建立mycat使用者並設定密碼

# useradd mycat
# passwd mycat

3,安裝

上傳安裝包 到mycat伺服器中的/home/mycat目錄,並解壓到/usr/local/mycat 目錄

4,設定mycat環境變數

# vi /etc/profile
## mycat env
export MYCAT_HOME=/usr/local/mycat
export PATH=$PATH:$MYCAT_HOME/bin
# source /etc/profile

5,配置mycat

1) 在配置mycat前,請確報mysql主從複製安裝完成並正常執行,mysql主從複製在mysql中配置,mycat不負責資料同步問題
配置mycat的schema.xml,如下:

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">
 <schema name="iuim" checkSQLschema="false" sqlMaxLimit="100">
        <table name="users" dataNode="dn1,dn2" rule="sharding-by-murmur" primaryKey="id"/>
 </schema>
    <dataNode name="dn1" dataHost="user_data_host1" database="iuim"/>
    <dataNode name="dn2" dataHost="user_data_host2" database="iuim"/>
    <dataHost name="user_data_host1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
        <heartbeat>show slave status</heartbeat>
        <!-- 一對主從複製的節點,注意master節點配置在前面,slave節點配置在後面-->
        <writeHost host="host_master1" url="192.168.2.170:3306" user="root" password="111111"></writeHost>
        <writeHost host="host_slave1" url="192.168.2.171:3306" user="root" password="111111"></writeHost>
    </dataHost>

    <dataHost name="user_data_host2" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native"
              switchType="1" slaveThreshold="100">
        <heartbeat>show slave status</heartbeat>
        <!-- 一對主從複製的節點,注意master節點配置在前面,slave節點配置在後面-->
        <writeHost host="host_master2" url="192.168.2.172:3306" user="root" password="111111"></writeHost>
        <writeHost host="host_slave2" url="192.168.2.174:3306" user="root" password="111111"></writeHost>
    </dataHost>
</mycat:schema>

配置mycat的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="nonePasswordLogin">0</property> <!-- 0為需要密碼登陸、1為不需要密碼登陸 ,預設為0,設定為1則需要指定預設賬戶-->
        <property name="useHandshakeV10">1</property>
        <property name="useSqlStat">0</property>  <!-- 1為開啟實時統計、0為關閉 -->
        <property name="useGlobleTableCheck">0</property>  <!-- 1為開啟全加班一致性檢測、0為關閉 -->
        <property name="sequnceHandlerType">2</property>
        <property name="subqueryRelationshipCheck">false</property> <!-- 子查詢中存在關聯查詢的情況下,檢查關聯欄位中是否有分片欄位 .預設 false -->
        <property name="processorBufferPoolType">0</property>
        <property name="handleDistributedTransactions">0</property>
        <!-- off heap for merge/order/group/limit      1開啟   0關閉-->
        <property name="useOffHeapForMerge">1</property>

        <!--單位為m -->
        <property name="memoryPageSize">64k</property>

        <!--單位為k -->
        <property name="spillsFileBufferSize">1k</property>

        <property name="useStreamOutput">0</property>

        <!--單位為m-->
        <property name="systemReserveMemorySize">384m</property>


        <!--是否採用zookeeper協調切換  -->
        <property name="useZKSwitch">false</property>

        <!-- XA Recovery Log日誌路徑 -->
        <!--<property name="XARecoveryLogBaseDir">./</property>-->

        <!-- XA Recovery Log日誌名稱 -->
        <!--<property name="XARecoveryLogBaseName">tmlog</property>-->
        <!--如果為 true的話 嚴格遵守隔離級別,不會在僅僅只有select語句的時候在事務中切換連線-->
        <property name="strictTxIsolation">false</property>
</system>
  <!—使用mycat連線mysql的使用者名稱與密碼->
    <user name="iuim_user">
        <property name="password">123456</property>
        <property name="schemas">iuim</property>
</user>
</mycat:server>

6、防火牆中開啟 8066 和 9066 埠

MyCat 的預設資料埠為 8066, mycat 通過這個埠接收資料庫客戶端的訪問請求。管理埠為 9066, 用來接收 mycat 監控命令、查詢 mycat 執行狀況、重新載入配置檔案等

7,啟動mycat(對應的, 重啟: mycat restart , 關閉: mycat stop )

# cd /usr/local/mycat/bin/
# ./mycat start

8,MyCat 連線測試

五,HAProxy叢集安裝(實現Mycat HA)

5.1 mycat節點2部署

參照第四章另外部署一臺mycat伺服器

5.2 配置Mycat狀態檢查服務(在mycat節點主機上配置)

1)1、如果 xinetd 還沒有安裝,可使用如下命令安裝:

# yum install xinetd

2)2、檢查/etc/xinetd.conf 的末尾是否有 includedir /etc/xinetd.d ,沒有就加上

# vi /etc/xinetd.conf

3) 檢查 /etc/xinetd.d 目錄是否存在,不存在剛建立

# mkdir /etc/xinetd.d/

4) 4、增加 MyCat 存活狀態檢測服務配置

# touch /etc/xinetd.d/mycat_status
# vi /etc/xinetd.d/mycat_status

增加以下內容:

service mycat_status
{
flags = REUSE
## 使用該標記的 socket_type 為 stream,需要設定 wait 為 no
socket_type = stream ## 封包處理方式, Stream 為 TCP 資料包
port = 48700 ## 服務監聽埠
wait = no ## 表示不需等待,即服務將以多執行緒的方式執行
user = root ## 執行此服務程序的使用者
server =/usr/local/bin/mycat_status ## 需要啟動的服務指令碼
log_on_failure += USERID ## 登入失敗記錄的內容
disable = no ## 要啟動服務,將此引數設定為 no
}

5) 新增 /usr/local/bin/mycat_status 服務指令碼

# vi /usr/local/bin/mycat_status

增加以下內容:

#!/bin/bash
#/usr/local/bin/mycat_status.sh
# This script checks if a mycat server is healthy running on localhost. It will
# return:
#
# "HTTP/1.x 200 OK\r" (if mycat is running smoothly)
#
# "HTTP/1.x 503 Internal Server Error\r" (else)
mycat=`/usr/local/mycat/bin/mycatstatus |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

6)、給新增指令碼賦予可執行許可權

# chmod a+x /usr/local/bin/mycat_status

7) 在 /etc/services 中加入 mycat_status 服務
# vi /etc/services
在末尾加入:

mycat_status 48700/tcp # mycat_status
    儲存後, 重啟 xinetd 服務
# service xinetd restart

8) 驗證 mycat_status 服務是否成功啟動

    # netstat -antup|grep 48700

這裡寫圖片描述

能看到上圖這樣的資訊,說明服務配置成功。
9) MyCat 服務主機的防火牆上開啟 48700 埠
10) 指令碼測試:

# /usr/local/bin/mycat_status

5.3 haproxy安裝

  1. 上傳haproxy-1.5.16.tar.gz 到 /usr/local/src, 解壓安裝
# cd /usr/local/src/
# tar -zxvf haproxy-1.5.16.tar.gz
# cd haproxy-1.5.16
  1. 安裝編譯所需的依賴外掛
# yum install gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel
  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 這三個包需要安裝不然不支援
4,建立安裝目錄
        # mkdir /usr/local/haproxy
5,執行安裝
        # make install PREFIX=/usr/local/haproxy
6,建立配置檔案目錄
# mkdir -p /usr/local/haproxy/conf
# mkdir -p /etc/haproxy/
7,從配置檔案模版複製配置檔案,並新增配置檔案軟連線
# cp /usr/local/src/haproxy-1.5.16/examples/haproxy.cfg /usr/local/haproxy/conf/
# ln -s /usr/local/haproxy/conf/haproxy.cfg /etc/haproxy/haproxy.cfg
8,拷貝錯誤頁面, 並新增目錄軟連線(HTTP 模式選配)
# cp -r /usr/local/src/haproxy-1.5.16/examples/errorfiles /usr/local/haproxy/
# ln -s /usr/local/haproxy/errorfiles /etc/haproxy/errorfiles
9,拷貝開機啟動檔案,並賦予可執行許可權
# cp /usr/local/src/haproxy-1.5.16/examples/haproxy.init /etc/rc.d/init.d/haproxy
# chmod +x /etc/rc.d/init.d/haproxy
10,新增 haproxy 命令指令碼軟連線
    # ln -s /usr/local/haproxy/sbin/haproxy /usr/sbin
11,設定 HAProxy 開機啟動
# chkconfig --add haproxy
# chkconfig haproxy on

5.4,HAProxy配置Mycat負載均衡叢集

1,修改 haproxy.cfg 配置檔案
    # vi /usr/local/haproxy/conf/haproxy.cfg
## global 配置中的引數為程序級別的引數,通常與其執行的作業系統有關
global
log 127.0.0.1 local0 info ## 定義全域性的 syslog 伺服器,最多可以定義 2### local0 是日誌裝置,對應於/etc/rsyslog.conf 中的配置,預設回收 info 的日誌級別
#log 127.0.0.1 local1 info
chroot /usr/share/haproxy ## 修改 HAProxy 的工作目錄至指定的目錄並在放棄許可權之前執行
### chroot() 操作,可以提升 haproxy 的安全級別
group haproxy ## 同 gid,不過這裡為指定的使用者組名
user haproxy ## 同 uid,但這裡使用的為使用者名稱
daemon ## 設定 haproxy 後臺守護程序形式執行
nbproc 1 ## 指定啟動的 haproxy 程序個數
### 只能用於守護程序模式的 haproxy;預設為止啟動 1 個程序,
### 一般只在單程序僅能開啟少數檔案描述符的場中中才使用多程序模式
maxconn 4096 ## 設定每個 haproxy 程序所接受的最大併發連線數,
### 其等同於命令列選項"-n", "ulimit-n"自動計算的結果正式參照從引數設定的
# pidfile /var/run/haproxy.pid ## 程序檔案(預設路徑 /var/run/haproxy.pid)
node haproxy-01 ## 定義當前節點的名稱,用於 HA 場景中多 haproxy 程序共享同一個 IP 地址時
description haproxy-01 ## 當前例項的描述資訊
## defaults:用於為所有其他配置段提供預設引數,這預設配置引數可由下一個"defaults"所重新設定
defaults
log global ## 繼承 global 中 log 的定義
mode http ## mode:所處理的模式 (tcp:四層 , http:七層 , health:狀態檢查,只會返回 OK)
### tcp: 例項運行於純 tcp 模式,在客戶端和伺服器端之間將建立一個全雙工的連線,
#### 且不會對 7 層報文做任何型別的檢查,此為預設模式
### http:例項運行於 http 模式,客戶端請求在轉發至後端伺服器之前將被深度分析,
#### 所有不與 RFC 模式相容的請求都會被拒絕
### health:例項運行於 health 模式,其對入站請求僅響應“OK”資訊並關閉連線,
#### 且不會記錄任何日誌資訊 ,此模式將用於相應外部元件的監控狀態檢測請求
option httplog
retries 3
option redispatch ## serverId 對應的伺服器掛掉後,強制定向到其他健康的伺服器
maxconn 2000 ## 前端的最大併發連線數(預設為 2000### 其不能用於 backend 區段,對於大型站點來說,可以儘可能提高此值以便讓 haproxy 管理連線佇列,
### 從而避免無法應答使用者請求。 當然,此最大值不能超過“global”段中的定義。
### 此外,需要留心的是, haproxy 會為每個連線維持兩個緩衝,每個快取的大小為 8KB,
### 再加上其他的資料,每個連線將大約佔用 17KB 的 RAM 空間,這意味著經過適當優化後 ,
### 有著 1GB 的可用 RAM 空間時將維護 40000-50000 併發連線。
### 如果指定了一個過大值,極端場景中,其最終所佔據的空間可能會超過當前主機的可用記憶體,
### 這可能會帶來意想不到的結果,因此,將其設定一個可接受值放為明智絕對,其預設為 2000
timeout connect 5000ms ## 連線超時(預設是毫秒,單位可以設定 us,ms,s,m,h,d)
timeout client 50000ms ## 客戶端超時
timeout server 50000ms ## 伺服器超時
## HAProxy 的狀態資訊統計頁面
listen admin_stats
bind :48800 ## 繫結埠
stats uri /admin-status ##統計頁面
stats auth admin:admin ## 設定統計頁面認證的使用者和密碼,如果要設定多個,另起一行寫入即可
mode http
option httplog ## 啟用日誌記錄 HTTP 請求
## listen: 用於定義通過關聯“前端”和“後端”一個完整的代理,通常只對 TCP 流量有用
listen mycat_servers
bind :3306 ## 繫結埠
mode tcp
option tcplog ## 記錄 TCP 請求日誌
option tcpka ## 是否允許向 server 和 client 傳送 keepalive
option httpchk OPTIONS * HTTP/1.1\r\nHost:\ www ## 後端服務狀態檢測
### 向後端伺服器的 48700 埠(埠值在後端伺服器上通過 xinetd 配置)傳送 OPTIONS 請求
### (原理請參考 HTTP 協議) , HAProxy 會根據返回內容來判斷後端服務是否可用.
### 2xx 和 3xx 的響應碼錶示健康狀態,其他響應碼或無響應表示伺服器故障。
balance roundrobin ## 定義負載均衡演算法,可用於"defaults""listen""backend"中,預設為輪詢方式
server mycat_01 192.168.1.203:8066 check port 48700 inter 2000ms rise 2 fall 3 weight 10
server mycat_02 192.168.1.204:8066 check port 48700 inter 2000ms rise 2 fall 3 weight 10
## 格式: server <name> <address>[:[port]] [param*]
### serser 在後端宣告一個 server,只能用於 listen 和 backend 區段。
### <name>為此伺服器指定的內部名稱,其將會出現在日誌及警告資訊中
### <address>此伺服器的 IPv4 地址,也支援使用可解析的主機名,但要在啟動時需要解析主機名至響應的 IPV4 地址
### [:[port]]指定將客戶端連線請求發往此伺服器時的目標埠,此為可選項
### [param*]為此 server 設定的一系列引數,均為可選項,引數比較多,下面僅說明幾個常用的引數:
#### weight:權重,預設為 1,最大值為 256, 0 表示不參與負載均衡
#### backup:設定為備用伺服器,僅在負載均衡場景中的其他 server 均不可以啟用此 server
#### check:啟動對此 server 執行監控狀態檢查,其可以藉助於額外的其他引數完成更精細的設定
#### inter:設定監控狀態檢查的時間間隔,單位為毫秒,預設為 2000,
##### 也可以使用 fastinter 和 downinter 來根據伺服器端專題優化此事件延遲
#### rise:設定 server 從離線狀態轉換至正常狀態需要檢查的次數(不設定的情況下,預設值為 2)
#### fall:設定 server 從正常狀態轉換至離線狀態需要檢查的次數(不設定的情況下,預設值為 3)
#### cookie:為指定 server 設定 cookie 值,此處指定的值將會在請求入站時被檢查,
##### 第一次為此值挑選的 server 將會被後續的請求所選中,其目的在於實現持久連線的功能
#### maxconn:指定此伺服器接受的最大併發連線數,如果發往此伺服器的連線數目高於此處指定的值,
#####其將被放置於請求佇列,以等待其他連線被釋放

注意:多節點部署時 node 、 description 的值要做相應調整
1, 根據以上 HAProxy 配置檔案要求做以下配置
(1) 新增 haproxy 使用者組和使用者

# groupadd haproxy
# useradd -g haproxy haproxy

(2)建立 chroot 執行的路徑


            
           

相關推薦

Mycat+Mysql主從複製+haproxy+keepalived實現可用分庫叢集方案

一, 部署架構 1.1架構圖 1.2 軟體版本 作業系統: CentOS2-7-X86_64-DVD-1708.iso JDK 版本: jdk1.8.0_11 Keepalived 版本: keepalived-1.2.18.tar.gz

mysql主從複製、讀寫分離、分庫、分片

第1章 引言 隨著網際網路應用的廣泛普及,海量資料的儲存和訪問成為了系統設計的瓶頸問題。對於一個大型的網際網路應用,每天幾十億的PV無疑對資料庫造成了相當高的負載。對於系統的穩定性和擴充套件性造成了極大的問題。通過資料切分來提高網站效能,橫向擴充套件資料層已經成為架構研發人員首選的方式。 水平切分資料庫:可

HAproxy+Keepalived實現可用

daemon type tom com rontab date redis start virt HAproxy+Keepalived實現高可用 說明: HA1:HAproxy+Keepalived(master) HA2:HAproxy+Keepalived(back

Redis 之 主從復制 + Keepalived 實現可用

edi keepal images 守護 定位 process 安裝redis RoCE 進程 一、Redis 主從復制 + Keepalived 實現高可用 作用:保證Redis高可用,首先搭建Redis 主從復制,然後在主從兩臺機器上分別安裝keepalived服務,把

CentOS7 haproxy+keepalived實現可用叢集搭建

一、搭建環境   CentOS7 64位         Keepalived  1.3.5         Haproxy 1.5.18   後端負載主機:192.168.166.21   192.168.166.22   兩臺節點上安裝rabbitmq服務      

rabbitmq+haproxy+keepalived實現可用叢集搭建

  專案需要搭建rabbitmq的高可用叢集,最近在學習搭建過程,在這裡記錄下可以跟大家一起互相交流(這裡只是記錄了學習之後自己的搭建過程,許多原理的東西沒有細說)。 搭建環境   CentOS7 64位   RabbitMQ 3.6.2   Keepalived 1.2.21   主機:192.1

haproxymysql主主複製的負載均衡中配keepalived實現可用

突破單點故障限制,實現熱備防止宕機 在主主複製的基礎和負載均衡的基礎之上用keepalived實現熱備 keepalived 提供一個vip 虛擬的ip,並監測haproxy1和haproxy2的執行情況,讓這個vip在兩者間進行搶佔(機制有預設,有優先,有宕機後另一個自動獲取) keep

分散式架構可用架構篇_08_MyCat在MySQL主從複製基礎上實現讀寫分離

一、環境作業系統:CentOS-6.6-x86_64-bin-DVD1.iso JDK 版本:jdk1.7.0_45MyCat 版本:Mycat-server-1.4-release-20151019230038-linux.tar.gzMyCat 節點 IP:192.168

mysql+proxysql+keepalived實現可用的數據庫讀寫分離

mysql讀寫分離 主從復制 proxysql前言 為了降低一臺數據庫的IO,遠程連接數據庫的時候,可以實現讀寫分離進行調度。這裏就出現了一個單點,所以必須要做一個高可用。當然數據庫服務器也需要做主從復制。實驗結構 說明:上圖的拓撲只是整個架構中的一個小部分,其余功能的實現此圖並未規

利用redis主從+keepalived實現可用

linux 運維 redisRedis簡介: Redis是一個開源的使用ANSI C語言編寫、支持網絡、可基於內存亦可持久化的日誌型、Key-Value數據庫,並提供多種語言的API。從2010年3月15日起,Redis的開發工作由VMware主持。 redis是一個key-value存儲系統。和Memc

Mycat 之 通過Keepalived 實現可用

alived com -o ali vpd type gin blog process 一、系統拓撲圖 一、操作方法 參考本博客的Nginx + Keepalived 實現高可用Mycat 之 通過Keepalived 實現高可用

MYSQL主從複製的簡單實現

系統環境:CENTOS7 MYSQL版本,status;第一行,mysql  Ver 14.14 Distrib 5.7.22, for linux-glibc2.12 (x86_64) using  EditLine wrapper 主庫:192.168.156.75

centos7.2 MYSQL雙主+半同步+keepalived實現可用負載均衡

這兩天瞭解了一下mysql的叢集方案,發現有很多解決方案,有複雜的也有簡單的,有興趣的參考下面網址:http://www.cnblogs.com/Kellana/p/6738739.html 這裡,我使用中小企業最常用也是較簡單的方案,用keepalived提供一個vip(

LVS+Keepalived實現可用負載均衡

lvs+keepalived 高可用 負載均衡 用LVS+Keepalived實現高可用負載均衡,簡單來說就是由LVS提供負載均衡,keepalived通過對rs進行健康檢查、對主備機(director)進行故障自動切換,實現高可用。1. LVS NAT模式配置準備三臺服務器,一臺director, 兩

Keepalived實現可用Nginx反向代理

keepalived實現高可用nginx反向代理由於好久沒有接觸過負載相關的調試了復習一下實驗系統:(1)CentOS 6.5_x86_64;(2)共有二臺主機,本實驗以ip地址來命名主機,即10主機、11主機。實驗前提:防火墻和selinux都關閉,主機之間時間同步實驗軟件:nginx-1.10.2-1.e

Linux運維學習之keepalived實現可用集群

keepalived 高可用 lvs 集群技術是一種較新的技術,通過集群技術,可以在付出較低成本的情況下獲得在性能、可靠性、靈活性方面的相對較高的收益,其任務調度則是集群系統中的核心技術。高可用高可用集群,簡單的說,集群就是一組計算機,它們作為一個整體向用戶提供一組網絡資源。 高可用

LVS-keepalived實現可用

keepalived前言: LVS是基於內核實現負載均衡的,在小編的上一篇演示中我們已經實現了LVS的NAT模式和DR模式,但是企業中只有負載均衡是不行的,如果一臺負載均衡器楚翔了故障,那麽就會導致整個集群的不可用,所以這裏結合LVS我們通過keepalived這個神器來實現高可用。 高可用:通常來描

項目實戰3—Keepalived 實現可用

ack logs 時間 mage 通知機制 http targe not table 實現基於Keepalived高可用集群網站架構   環境:隨著業務的發展,網站的訪問量越來越大,網站訪問量已經從原來的1000QPS,變為3000QPS,目前業務已經通過集群LVS架

nginx+keepalived實現可用負載均衡

其中 centos7.3 9.png IT 配置文件 bsp 是我 add nginx 環境: centos7.3虛擬機A 10.0.3.46 centos7.3虛擬機B 10.0.3.110 虛擬機A和B都需要安裝nginx和keepalived(過程省略,其中keepa

利用keepalived實現可用nginx

keepalived 高可用nginx實驗拓撲圖(1)本次基於VMware Workstation搭建一個四臺Linux(CentOS 7.4)系統所構成的一個服務器集群,其中兩臺nginx做前端調度服務器(一臺為主機,另一臺為備機),另外兩臺作為真實的Web服務器(向外部提供http服務,這裏僅僅使用了Ce