MySQL是一個小型關系型數據庫,性能方面存在先天性不足,盡管如此,其也因為開源、免費、可自主迭代研發、總體擁有成本低等諸多優點被廣大企業使用。目前業界有許多方法可以降低MySQL性能上限不足問題,軟件層面可通過數據庫中間件解決(如MyCAT、DRDS等),架構層面可以通過業務解耦、冷熱溫數據分離存儲等方式,降低高并發業務對MySQL數據庫的沖擊。盡管如此,但在MySQL實例規模較多時,通過合理規劃MySQL配置,一是可以確保降低高并發業務沖擊數據庫導致的數據庫宕機風險,二是可以最大化的利用服務器資源,以節約企業資源投入成本,三是通過統一標準化的配置可以較大程度降低自動化運維研發投入成本。
本文重點針對MySQL+Keepalived高可用架構進行講解,包含MySQL配置、Keepalived高可用配置,并附帶有相應的VIP切換監控腳本。
Mysql中Master->Slave的主主同步。主主是數據雙向同步,主從是數據單向同步。一般情況下,主庫宕機后,需要手動將連接切換到從庫上。但如果使用keepalived組件架構可實現自動切換,保證數據庫的高可用性。
在MySQL雙主結構當中,使用keepalived,通過VIP實現Mysql雙主對外連接的統一接口。即客戶端通過Vip連接數據庫;保障其中某一臺主機出現故障,無法提供服務時,VIP可自動漂移到另一臺主機上,整個過程對于客戶端接來說幾乎無感覺,從而實現高可用。
為保障MySQL數據的一致性,必須避免VIP頻繁漂移。當keepalived檢測發現MySQL服務工作異常時,VIP漂移,為禁止VIP出現二次漂移,必須人工介入操作,從而保障數據的一致性及安全性。所以,在MySQL+keepalived使用過程中,master和slave兩節點均設置為backup,當人工介入,對故障主機處理完畢之后,重新啟動keepalived,不會出現VIP漂移的情況,只有僅當keepalived檢測到MySQL無法提供服務,才會執行VIP漂移。
Mysql安裝部署:
軟件信息
軟件名稱 | 版本號 |
MySQL | MySQL官方社區5.7 |
主機參數調整:
禁用selinux
#vi/etc/sysconfig/selinux
查看是否SELINUX=disabled
關閉numa
#vi/etc/default/grub
在GRUB_CMDLINE_LINUX這一行最后添加numa=off,使其變為GRUB_CMDLINE_LINUX=”crashkernel=auto…… rhgb quiet numa=off”,變更完成后保存退出。
#grub2-mkconfig -o /boot/grub2/grub.cfg
文件數進程數限制
#vi /etc/security/limits.conf
添加mysql用戶限制如下:
mysqlsoft nproc 65535
mysql hard nproc 65535
mysql soft nofile65536
mysql hard nofile 65536
#vi/etc/sysctl.conf
將該配置文件內容清空,改成以下內容
vm.swappiness=0
net.ipv6.conf.all.disable_ipv6=1
net.core.somaxconn=65535
net.core.netdev_max_backlog=65535
net.ipv4.tcp_max_syn_backlog=65535
net.ipv4.tcp_fin_timeout=10
net.ipv4.tcp_tw_reuse=1
#netipv4.tcp_tw_recycle=1
net.core.wmem_default=87380
net.core.wmem_max=16777216
net.core.rmem_default=87380
net.core.rmem_max=16777216
net.ipv4.tcp_keepalive_time=120
net.ipv4.tcp_keepalive_intvl=30
net.ipv4.tcp_keepalive_probes=3
net.ipv4.ip_local_port_range= 40000 60000
kernel.sem = 250 32000 100 128
創建mysql用戶:
#groupadd mysql
#useradd -g mysql -m mysql
依賴包安裝:
軟件安裝前需檢查以下依賴包,將缺少的依賴包安裝。
#rpm-q gcc gcc-c++ zlib-devel pcre-devel readline readline-develbzip2-devel rpm-build kernel-devel libaio-develelfutils-libelf-devel compat-libstdc++-33 compat-libcap1 cmake bisonautomake ncurses-devel xinetd openssl-devel |grep "notinstalled"
軟件安裝:
#cd/opt
#tar –xzvf mysql-version-os.tar.gz
#cdmysql-version-os
#cmake .-DCMAKE_INSTALL_PREFIX=/opt/mysql-version
-DWITH_BOOST=boost/boost_1_59_0
-DDEFAULT_CHARSET=utf8mb4
-DDEFAULT_COLLATION=utf8mb4_bin
# make&&makeinstall
建立軟鏈接:
#ln-s /opt/mysql-version-os /usr/local/mysql
#ln -s/usr/local/mysql/bin/* /usr/local/bin
初始化數據庫,MySQL數據目錄:
實例要創建在/data/mysql下,實例中目錄的具體劃分如下:
主目錄 | 二級目錄 | 三級目錄 |
/data/mysql/db_insname | bin(啟動腳本目錄) | login.sh |
shutdown.sh | ||
startup.sh | ||
blog | mysql-bin.* | |
mysql-bin.index | ||
conf(配置文件目錄) | init_file.sql | |
insname.cnf | ||
data(數據目錄) | ||
elog(慢日志、錯誤日志) | mysql.err | |
slow.log | ||
mysql.pid | ||
mysql.sock | ||
mysql.sock.lock | ||
nohup.out | ||
rlog(表空間目錄) | ib_logfile0 | |
ib_logfile1 | ||
ib_logfile2 | ||
tmp(臨時目錄) | ||
ulog(undo表空間目錄) | undo001 | |
undo002 |
配置參數說明:
參數名 | 數值 | 配置說明 |
max_connections | 5000 | 數據庫中已連接的所有用戶總數不超過5000 |
max_user_connections | 1200 | 單個用戶最大連接數不超過1200 |
connect_timeout | 10 | 建立數據庫連接時不允許超過十秒 |
wait_timeout | 600 | 狀態為sleep的線程超過600秒會被關閉 |
max_execution_time | 10000 | 執行時間超過10000毫秒的sql語句會被終止 |
innodb_lock_wait_timeout | 10 | 事務中的DML語句10秒未獲得鎖,會回滾整個事務 |
sql_safe_updates | 1 | 使用update或delete必須用where條件且使用索引 |
loose_rpl_semi_sync_master_enabled | on | 開啟半同步 |
loose_rpl_semi_sync_master_timeout | 1000 | 客戶端等待1秒得不到確認變為異步 |
loose_rpl_semi_sync_master_wait_for_slave_count | 1 | 主庫收到1個從庫寫成功則返回客戶端 |
loose_rpl_semi_sync_master_wait_no_slave | on | 啟動備庫后進入半同步模式 |
log_queries_not_using_indexes | 1 | 查詢不使用索引會計入慢日志 |
secure_file_priv | /data/mysql/db_insname/tmp | 在庫中提取數據的數據存放路徑 |
實例創建:
setserver.ini配置文件
10.10.1.133 /usr/local/mysql /data/mysql db test1 3306 11 root 123456 512M |
setServer_57.sh配置文件
#!/bin/bash
#目錄、端口、實例名等信息的配置文件
INI_CFG=./setServer.ini
#IP
IP=""
#軟件目錄
SOFTDIR=""
#根目錄
BASE_DIR=""
#實例名
INS_NAME=""
#實例名前綴
INS_NAME_PRE=""
#實例端口
INS_PORT=""
#server id
SERVER_ID=""
#實例根目錄
INS_BASE_DIR=""
#管理員用戶
ADMIN_USER=""
#管理員密碼
ADMIN_PASSWD=""
#實例參數文件
INS_CNF=""
#初始化SQL文件
INIT_FILE=""
#INNODB_BUFFER_POOL_SIZE設定
BUFFER_POOL=""
function Isok()
{
[ $? == "0" ] && echo "Complete OK !" || echo " Failed !!!";exit 128
}
#創建實例函數
function create_instance()
{
#1、創建實例相應目錄
mkdir -p ${INS_BASE_DIR}/{bin,conf,data,rlog,ulog,blog,elog,tmp}
chmod -R 755 ${INS_BASE_DIR}
echo "****** 1、創建目錄:"
echo " 啟動腳本目錄:${INS_BASE_DIR}/bin"
echo " 配置文件目錄:${INS_BASE_DIR}/conf"
echo " 數據目錄:${INS_BASE_DIR}/data"
echo " relog目錄:${INS_BASE_DIR}/rlog"
echo " ulog目錄:${INS_BASE_DIR}/ulog"
echo " blog目錄:${INS_BASE_DIR}/blog"
echo " elog目錄:${INS_BASE_DIR}/elog"
echo " 臨時目錄:${INS_BASE_DIR}/tmp"
#2、生成參數文件
cat <
set global sql_safe_updates=1;
EOF
cat <
[mysqld]
#************** basic ***************
datadir =${INS_BASE_DIR}/data
basedir =${SOFTDIR}
tmpdir =${INS_BASE_DIR}/tmp
secure_file_priv =${INS_BASE_DIR}/tmp
port =${INS_PORT}
socket =${INS_BASE_DIR}/mysql.sock
pid_file =${INS_BASE_DIR}/mysql.pid
#************** connection ***************
max_connections =5000
max_connect_errors =100000
max_user_connections =1200
#************** sql timeout & limits ***************
max_execution_time =10000
group_concat_max_len =1048576
lock_wait_timeout =60
#autocommit =0
lower_case_table_names =1
thread_cache_size =64
disabled_storage_engines ="MyISAM,FEDERATED"
character_set_server =utf8
transaction-isolation ="READ-COMMITTED"
skip_name_resolve =ON
explicit_defaults_for_timestamp =ON
log_timestamps =SYSTEM
local_infile =OFF
event_scheduler =OFF
query_cache_type =OFF
query_cache_size =0
lc_messages =en_US
lc_messages_dir =${SOFTDIR}/share
init_connect ="set names utf8"
#sql_mode =NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO
init_file =${INIT_FILE}
#init_slave
#******************* err & slow & general ***************
log_error =${INS_BASE_DIR}/elog/mysql.err
#log_output ="TABLE,FILE"
slow_query_log =ON
slow_query_log_file =${INS_BASE_DIR}/elog/slow.log
long_query_time =1
log_queries_not_using_indexes =0
log_throttle_queries_not_using_indexes = 10
general_log =OFF
general_log_file =${INS_BASE_DIR}/elog/general.log
#************** binlog & relaylog ***************
expire_logs_days =7
sync_binlog =1
log-bin =${INS_BASE_DIR}/blog/mysql-bin
log-bin-index =${INS_BASE_DIR}/blog/mysql-bin.index
max_binlog_size =500M
binlog_format =ROW
binlog_rows_query_log_events =ON
binlog_cache_size =2M
binlog_stmt_cache_size =2M
max_binlog_cache_size =512M
max_binlog_stmt_cache_size =512M
relay_log =${INS_BASE_DIR}/blog/relay
relay_log_index =${INS_BASE_DIR}/blog/relay.index
max_relay_log_size =500M
relay_log_purge =ON
relay_log_recovery =ON
#*************** rpl_semi_sync ***************
loose_rpl_semi_sync_master_enabled =ON
loose_rpl_semi_sync_master_timeout =1000
loose_rpl_semi_sync_master_trace_level =32
loose_rpl_semi_sync_master_wait_for_slave_count =1
loose_rpl_semi_sync_master_wait_no_slave =ON
loose_rpl_semi_sync_master_wait_point =AFTER_SYNC
loose_rpl_semi_sync_slave_enabled =ON
loose_rpl_semi_sync_slave_trace_level =32
#*************** group commit ***************
binlog_group_commit_sync_delay =1
binlog_group_commit_sync_no_delay_count =1000
#*************** gtid ***************
gtid_mode =ON
enforce_gtid_consistency =ON
master_verify_checksum =ON
sync_master_info =1
#*************slave ***************
skip-slave-start =1
#read_only =ON
#super_read_only =ON
log_slave_updates =ON
server_id =${SERVER_ID}
report_host =$IP
report_port =${INS_PORT}
slave_load_tmpdir =${INS_BASE_DIR}/tmp
slave_sql_verify_checksum =ON
slave_preserve_commit_order =1
#*************** muti thread slave ***************
slave_parallel_type =LOGICAL_CLOCK
slave_parallel_workers =4
master_info_repository =TABLE
relay_log_info_repository =TABLE
#*************** buffer & timeout ***************
read_buffer_size =1M
read_rnd_buffer_size =2M
sort_buffer_size =1M
join_buffer_size =1M
tmp_table_size =16777216
max_allowed_packet =64M
max_heap_table_size =64M
connect_timeout =10
wait_timeout =600
interactive_timeout =600
net_read_timeout =30
net_write_timeout =30
#*********** myisam ***************
skip_external_locking =ON
key_buffer_size =2M
bulk_insert_buffer_size =16M
concurrent_insert =ALWAYS
open_files_limit =65000
table_open_cache =16000
table_definition_cache =16000
#*********** innodb ***************
default_storage_engine =InnoDB
default_tmp_storage_engine =InnoDB
internal_tmp_disk_storage_engine =InnoDB
innodb_data_home_dir =${INS_BASE_DIR}/data
innodb_log_group_home_dir =${INS_BASE_DIR}/rlog
innodb_log_file_size =1024M
innodb_log_files_in_group =3
innodb_undo_directory =${INS_BASE_DIR}/ulog
innodb_undo_log_truncate =on
innodb_max_undo_log_size =1024M
innodb_undo_tablespaces =3
innodb_flush_log_at_trx_commit =2
innodb_fast_shutdown =1
innodb_flush_method =O_DIRECT
innodb_io_capacity =1000
innodb_io_capacity_max =4000
innodb_buffer_pool_size =${BUFFER_POOL}
innodb_log_buffer_size =8M
innodb_autoinc_lock_mode =1
innodb_buffer_pool_load_at_startup =ON
innodb_buffer_pool_dump_at_shutdown =ON
innodb_buffer_pool_dump_pct =15
innodb_max_dirty_pages_pct =85
innodb_lock_wait_timeout =10
#innodb_locks_unsafe_for_binlog =1
innodb_old_blocks_time =1000
innodb_open_files =63000
innodb_page_cleaners =4
innodb_strict_mode =ON
innodb_thread_concurrency =0
innodb_sort_buffer_size =64M
innodb_print_all_deadlocks =1
innodb_rollback_on_timeout =ON
EOF
echo "****** 2、生成參數文件:"
echo " 實例${INS_NAME}的參數文件: ${INS_CNF}"
# 3、實例化數據庫
echo "****** 3、初始化數據庫:"
#[ `echo $USER` == "root" ] && chown mysql:root $INS_BASE_DIR
${SOFTDIR}/bin/mysqld --defaults-file=${INS_CNF}
--initialize-insecure --user=mysql
--basedir=${SOFTDIR}
--datadir=${INS_BASE_DIR}/data
#4、生成啟動、關閉、登陸腳本
echo "****** 4、生成啟動、關閉、登陸腳本:"
cat <
#!/bin/bash
source /etc/profile
source ~/.bash_profile
export UMASK=0644
export UMASK_DIR=0750
## vars
SOFTDIR=${SOFTDIR}
DBHOME=${INS_BASE_DIR}
DBNAME=${INS_NAME}
CNF=${DBHOME}/conf/${DBNAME}.cnf
DATADIR=${DBHOME}/data
## startup
nohup ${SOFTDIR}/bin/mysqld_safe --defaults-file=${CNF} --ledir=${SOFTDIR}/bin >${DBHOME}/nohup.out 2>&1 &
EOF
cat <
#!/bin/bash
source /etc/profile
source ~/.bash_profile
## vars
SOFTDIR=${SOFTDIR}
DBHOME=${INS_BASE_DIR}
DBNAME=${INS_NAME}
CNF=${DBHOME}/conf/${DBNAME}.cnf
SOCK=${DBHOME}/mysql.sock
## shutdown
${SOFTDIR}/bin/mysqladmin --defaults-file=${CNF} -uroot -p -S${SOCK} shutdown
EOF
cat <
SOFTDIR=${SOFTDIR}
DBHOME=${INS_BASE_DIR}
DBNAME=${INS_NAME}
SOCK=${DBHOME}/mysql.sock
${SOFTDIR}/bin/mysql -uroot -p -S${SOCK} -A
EOF
chmod 700 ${INS_BASE_DIR}/bin/startup.sh ${INS_BASE_DIR}/bin/shutdown.sh ${INS_BASE_DIR}/bin/login.sh
#5、修改管理員密碼
echo "****** 5、修改管理員密碼:"
hostname=`hostname`
sh ${INS_BASE_DIR}/bin/startup.sh
sleep 30
${SOFTDIR}/bin/mysql -uroot -S${INS_BASE_DIR}/mysql.sock< #install semi sync install plugin rpl_semi_sync_slave soname semisync_slave.so; install plugin rpl_semi_sync_master soname semisync_master.so; #root alter user root@localhost identified by "${ADMIN_PASSWD}"; delete from mysql.user where user=root and host=lower("${hostname}"); #備份用戶 GRANT SELECT,SHOW VIEW,TRIGGER,LOCK TABLES,RELOAD,PROCESS,SUPER ON *.* TO bkpuser@% IDENTIFIED BY "n#CJ^f&i"; #復制用戶 GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO replic@% IDENTIFIED BY "4%REplic"; #業務數據監控用戶 create user monitorjk identified by esEYq7QWkB6F2M$; #數據庫監控用戶 grant PROCESS, REPLICATION CLIENT, SELECT on *.* to zabbixjk identified by CvNYz!6WIb9u; #4A用戶 GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, INDEX, ALTER, SHOW DATABASES, CREATE USER ,RELOAD ON *.* TO aiuap@% IDENTIFIED BY "p#1nVF.|c1" WITH GRANT option; #運維管理用戶 GRANT ALL ON *.* TO myrobot@127.0.0.1 identified by Si*hx79*HIqHQdLY with grant option; #inception用戶 GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, PROCESS, INDEX, ALTER, SUPER, REPLICATION SLAVE, REPLICATION CLIENT, TRIGGER ON *.* TO inception identified by fF&w@tw5qZK1WRvi; flush privileges; shutdown; EOF [ $? == "0" ] && echo " 密碼修改成功!" #修改配置文件,使半同步參數生效 sleep 5 sed -i s/loose_//g ${INS_CNF} sh ${INS_BASE_DIR}/bin/startup.sh echo "****** 6、網絡監聽:" netstat -pltn 2>/dev/null |grep -E "Proto|$INS_PORT|mysql" echo "****** 7、MySQL錯誤日志:" grep -Ei "error|warning" $INS_BASE_DIR/elog/mysql.err } if [ -f ${INI_CFG} ]; then grep -v "^#" ${INI_CFG} | while read line do IP=`echo ${line} | cut -d" " -f1` SOFTDIR=`echo ${line} | cut -d" " -f2 | sed s//$//` BASE_DIR=`echo ${line} | cut -d" " -f3 | sed s//$//` INS_NAME_PRE=`echo ${line} | cut -d" " -f4` INS_NAME=`echo ${line} | cut -d" " -f5` INS_PORT=`echo ${line} | cut -d" " -f6` SERVER_ID=`echo ${line} | cut -d" " -f7` ADMIN_USER=`echo ${line} | cut -d" " -f8` ADMIN_PASSWD=`echo ${line} | cut -d" " -f9` BUFFER_POOL=`echo ${line} | cut -d" " -f10` INS_BASE_DIR=${BASE_DIR}/${INS_NAME_PRE}_${INS_NAME} INS_CNF=${INS_BASE_DIR}/conf/${INS_NAME}.cnf INIT_FILE=${INS_BASE_DIR}/conf/init_file.sql echo "****** 實例${INS_NAME}信息: ******" echo " IP: ${IP}" echo " 軟件目錄: ${SOFTDIR}" echo " 根目錄: ${BASE_DIR}" echo " 實例根目錄: ${INS_BASE_DIR}" echo " 實例名前綴: ${INS_NAME_PRE}" echo " 實例名: ${INS_NAME}" echo " 實例端口: ${INS_PORT}" echo " server_id: ${SERVER_ID}" echo " 管理員用戶: ${ADMIN_USER}" echo " 管理員密碼: ${ADMIN_PASSWD}" echo " INNODB_BUFFER_POOL_SIZE設定: ${BUFFER_POOL}" if [ `echo ${line} | awk {print NF}` != "10" ]; then echo "ERROR:創建實例相應參數不夠!" echo "##############################################################################################" echo -e "
" #判斷端口與ibdata01文件是否存在,都不存在則創建實例。存在一個則創建失敗 elif [ X"`netstat -ltn | grep ${INS_PORT}`" = X"" ] && [ ! -f ${INS_BASE_DIR}/data/ibdata01 ]; then #調用創建實例函數 create_instance; else echo "ERROR:端口${INS_PORT}或${INS_BASE_DIR}/data/ibdata01文件存在,創建實例失?。? echo "##############################################################################################" echo -e "
" fi done else echo "ERROR:${INI_CFG}配置文件不存在!" exit 1 fi
數據庫的初始化使用上面兩個腳本完成。
1.填寫setserver.ini配置文件。
2.執行setserver.sh,初使化數據庫。
setserver.ini,填寫方法如下:
序列 | 名稱 | 示例 |
第1列 | ip | 0.0.0.1 |
第2列 | 軟件目錄 | /usr/local/mysql |
第3列 | 數據根目錄 | /data/mysql |
第4列 | 實例名前綴 | Db |
第5列 | 實例名 | Insname |
第6列 | 端口 | 20001 |
第7列 | serverid(如果有兩個節點,serverid不能一樣,一個寫01一個寫02) | port+01/port+02 |
第8列 | root賬號 | Root |
第9列 | root密碼 | Root |
setserver.sh
用mysql用戶執行腳本完成數據庫實例初始化。
登錄數據庫
數據庫登錄腳本在/data/mysql/db_InsName/bin下,login.sh。
復制方式:半同步、主主復制
操作步驟:
登陸節點1:
步驟 | 操作 | 解釋 |
1 | mysql>RESET MASTER; | 重置 |
2 | mysql>CHANGE MASTER TO | 配置主主 |
3 | mysql>START SLAVE; | 啟動服務 |
登陸節點2:
步驟 | 操作 | 解釋 |
1 | mysql>RESET MASTER; | 重置 |
2 | mysql>CHANGE MASTER TO | 配置主主 |
3 | mysql>START SLAVE; | 啟動服務 |
集群中的每一個MySQL實例都多帶帶部署在一個物理機,考慮到容錯和網絡環境盡量實現跨機柜部署。
禁止集群的一對主從部署在同一臺物理機。
MySQL不應和高磁盤I/O,高計算任務的應用部署在同一臺物理機上
軟件名稱 | 版本號 |
Keepalived | Keepalived-1.3.2 |
安裝目錄規范:
軟件安裝目錄:/usr/local/keepalived
日志輸出目錄:/usr/local/keepalived/log/keepalived.log
配置文件目錄:/etc/keepalived/keepalived.conf
檢測腳本目錄:/etc/keepalived/scripts/
參數文件目錄:/etc/sysconfig/keepalived
執行文件目錄:/usr/sbin/keepalived
啟動文件目錄:/etc/rc.d/init.d/keepalived
源碼存放目錄:/tmp/keepalived-1.3.2/
keepalived安裝:
在root用戶權限下執行:
rpm-qa make gcc libpopt-dev libnl-dev libcurl4-openssl-dev | grep "notinstall"
查看是否存在未安裝的依賴包。(注意:當操作系統語言為中文時需注意,notinstall篩選不出結果,可自行查看是否存在對應依賴包。)
如果存在未安裝的依賴包,則對缺失的依賴包進行安裝。
tar zxf keepalived-1.3.2.tar.gz,進入目錄并編譯
在編譯過程中,只需要執行安裝目錄,其他使用默認配置即可。
./configure –prefix=/usr/local/keepalived
make && make install
在keepalived1.3.2中,部分系統所需使用的腳本文件在源碼安裝包中,即腳本存在位置為:/tmp/keepalived-1.3.2/keepalived/etc。
復制可執行文件:
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
復制系統服務文件:
cp/tmp/keepalived-1.3.2/keepalived/etc/init.d/keepalived /etc/rc.d/init.d/
復制參數文件:
cp/usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
創建配置文件/腳本文件目錄:
mkdir -p /etc/keepalived/scripts
將以下目錄用戶及所屬組該為mysql
/etc/keepalived
/usr/local/keepalived
chown -R mysql:mysql /etc/keepalived
chown -R mysql:mysql /usr/local/keepalived
1、修改keepalived啟動參數文件
vi /etc/sysconfig/keepalvied
將文件中KEEPALIVED_OPTIONS=”-D”修改為:
KEEPALIVED_OPTIONS=”-D -d -S 0”
2、修改rsyslog.conf文件
vi /etc/rsyslog.conf
在文件最后增加一行:
local0.* /usr/local/keepalived/log/keepalived.log
3、重啟rsyslog服務
systemctl restart rsyslog
參數說明:
參數名 | 配置說明 |
vrrp_script塊 | keepalived調用檢測腳本塊 |
script | 檢測腳本文件指定 |
ineerval | 檢測腳本調用周期 |
vrrp_instance塊 | keepalivd配置塊 |
state | keepalived角色狀態,只有MASTER和BACKUP兩種,必須使用大寫 |
interface | keepalived實例綁定網卡 |
virtual_router_id | 實例ID,用于主備之間互通,主備必須相同,值范圍:0-255 |
priority | 權重值 |
advert_int | keepalived之間心跳檢測時間間隔 |
nopreempt | 設置不搶占 |
track_script | 選擇檢測腳本塊 |
authentication | 認證設置 |
auth_type | 認證方式 |
auth_pass | 認證密碼,最大不可超過8位 |
virtual_ipaddress | 設置服務IP |
vrrp_garp_master_refresh | Master發一次ARP包到網關的間隔時間,可以防止產生腦裂 |
配置文件展示:
global_defs {
vrrp_garp_master_refresh10 #Master間隔10s發一次ARP包到網關
}
vrrp_scriptcheck_run {
script"/etc/keepalived/scripts/keepalived_check_mysql.sh"#
需手工修改文件中的mysql端口號
interval30
weight0
}
vrrp_instanceVI_1 {
stateBACKUP
interfaceteam0 # 網卡,根據實際情況填寫
virtual_router_id155 # 推薦使用虛IP第四段數字
priority101
advert_int1
authentication{
auth_typePASS
auth_pass1111
}
virtual_ipaddress{
0.0.0.1 # 虛IP
}
track_script{
check_run
}
notify_master/etc/keepalived/scripts/notify_master.sh
}
mysql數據庫VIP切換操作步驟 | ||||
序號 | 主任務 | 子任務 | 操作節點 | 操作命令 |
1 | VIP切換前準備 | 檢查數據庫同步狀態 | 主從節點 | show slave statusG |
2 | 檢查數據庫日志 | 主從節點 | tail -1000f /data/db_{實例名}/elog/mysql.err | |
3 | 檢查keepalived狀態 | 主從節點 | ps -ef |grep -i keepalived | |
4 | VIP切換階段 | 設置read_only為on | 主節點 | set global read_only=on; |
5 | kill應用連接 | 主節點 | kill processid; | |
6 | 切換VIP | 主節點 | sudo systemctl stop keepalived | |
7 | 檢查VIP是否切換成功 | 主從節點 | ip a | |
8 | 檢查應用連接 | 主從節點 | show processlist; | |
9 | 檢查同步狀態 | 主從節點 | show slave statusG | |
10 | 設置read_only為off | 新主節點 | set global read_only=off; |
說明:為保障MySQL數據庫數據的一致性,防止keepalived虛擬IP節點漂移次數過于頻繁,在state中設置為雙BACKUP,即主從均為BACKUP,此時,如果主機出現故障或宕機,從機檢測到之后,接管VIP,并繼續提供服務。主機恢復,仍不會爭用VIP,直至下次從機出現故障宕機,VIP才會進行第二次漂移,恢復到原主機,繼續提供服務。該設置避免頻繁切換數據庫節點,導致數據的不一致。
當提供服務的一臺出現故障的時候,另外一臺會馬上自動接管并且提供服務,而且切換的時間非常短,mysql雙主復制,即互為Master-Slave(只有一個Master提供寫操作),可以實現數據庫服務器的熱備,但是一個Master宕機后不能實現動態切換。使用Keepalived,可以通過虛擬IP,實現雙主對外的統一接口以及自動檢查、失敗切換機制,基本不需要人工干預操作,從而實現MySQL數據庫的高可用性。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/130214.html
摘要:假設反向代理層是,里能夠配置多個后端,并且能夠探測到多個后端的存活性。以為例,天然支持主從同步,官方也有哨兵機制,來做的存活性檢測。方法論上,高可用是通過冗余自動故障轉移來實現的。 究竟啥才是互聯網架構高可用 一、什么是高可用 高可用HA(High Availability)是分布式系統架構設計中必須考慮的因素之一,它通常是指,通過設計減少系統不能提供服務的時間。假設系統一直能夠提供服...
摘要:在協議實現里,虛擬路由器使用作為虛擬地址,就是唯一的,這個地址同一時間只有一個物理路由器占用。在虛擬路由器里面的物理路由器組里面通過多播地址來定時發送通告消息。負責健康檢查,包括常見的各種檢查方式。 公司內部 OA 系統要做線上高可用,避免單點故障,所以計劃使用2臺虛擬機通過 Keepalived 工具來實現 nginx 的高可用(High Avaiability),達到一臺nginx...
摘要:雙主是一個比較簡單的高可用架構,適用于中小集群,今天就說說怎么用做的高可用。缺點也比較明顯,就是增加從節點的情況下,從節點不會主動切換同步對象,而且腳本需要自己實現,有一定風險。 雙主 + keepalived 是一個比較簡單的 MySQL 高可用架構,適用于中小 MySQL 集群,今天就說說怎么用 keepalived 做 MySQL 的高可用。 1 概述 1.1 keepalive...
閱讀 1359·2023-01-11 13:20
閱讀 1707·2023-01-11 13:20
閱讀 1215·2023-01-11 13:20
閱讀 1908·2023-01-11 13:20
閱讀 4166·2023-01-11 13:20
閱讀 2759·2023-01-11 13:20
閱讀 1402·2023-01-11 13:20
閱讀 3673·2023-01-11 13:20