MySQL是一個(gè)小型關(guān)系型數(shù)據(jù)庫,性能方面存在先天性不足,盡管如此,其也因?yàn)殚_源、免費(fèi)、可自主迭代研發(fā)、總體擁有成本低等諸多優(yōu)點(diǎn)被廣大企業(yè)使用。目前業(yè)界有許多方法可以降低MySQL性能上限不足問題,軟件層面可通過數(shù)據(jù)庫中間件解決(如MyCAT、DRDS等),架構(gòu)層面可以通過業(yè)務(wù)解耦、冷熱溫?cái)?shù)據(jù)分離存儲(chǔ)等方式,降低高并發(fā)業(yè)務(wù)對MySQL數(shù)據(jù)庫的沖擊。盡管如此,但在MySQL實(shí)例規(guī)模較多時(shí),通過合理規(guī)劃MySQL配置,一是可以確保降低高并發(fā)業(yè)務(wù)沖擊數(shù)據(jù)庫導(dǎo)致的數(shù)據(jù)庫宕機(jī)風(fēng)險(xiǎn),二是可以最大化的利用服務(wù)器資源,以節(jié)約企業(yè)資源投入成本,三是通過統(tǒng)一標(biāo)準(zhǔn)化的配置可以較大程度降低自動(dòng)化運(yùn)維研發(fā)投入成本。
本文重點(diǎn)針對MySQL+Keepalived高可用架構(gòu)進(jìn)行講解,包含MySQL配置、Keepalived高可用配置,并附帶有相應(yīng)的VIP切換監(jiān)控腳本。
Mysql中Master->Slave的主主同步。主主是數(shù)據(jù)雙向同步,主從是數(shù)據(jù)單向同步。一般情況下,主庫宕機(jī)后,需要手動(dòng)將連接切換到從庫上。但如果使用keepalived組件架構(gòu)可實(shí)現(xiàn)自動(dòng)切換,保證數(shù)據(jù)庫的高可用性。
在MySQL雙主結(jié)構(gòu)當(dāng)中,使用keepalived,通過VIP實(shí)現(xiàn)Mysql雙主對外連接的統(tǒng)一接口。即客戶端通過Vip連接數(shù)據(jù)庫;保障其中某一臺(tái)主機(jī)出現(xiàn)故障,無法提供服務(wù)時(shí),VIP可自動(dòng)漂移到另一臺(tái)主機(jī)上,整個(gè)過程對于客戶端接來說幾乎無感覺,從而實(shí)現(xiàn)高可用。
為保障MySQL數(shù)據(jù)的一致性,必須避免VIP頻繁漂移。當(dāng)keepalived檢測發(fā)現(xiàn)MySQL服務(wù)工作異常時(shí),VIP漂移,為禁止VIP出現(xiàn)二次漂移,必須人工介入操作,從而保障數(shù)據(jù)的一致性及安全性。所以,在MySQL+keepalived使用過程中,master和slave兩節(jié)點(diǎn)均設(shè)置為backup,當(dāng)人工介入,對故障主機(jī)處理完畢之后,重新啟動(dòng)keepalived,不會(huì)出現(xiàn)VIP漂移的情況,只有僅當(dāng)keepalived檢測到MySQL無法提供服務(wù),才會(huì)執(zhí)行VIP漂移。
Mysql安裝部署:
軟件信息
軟件名稱 | 版本號(hào) |
MySQL | MySQL官方社區(qū)5.7 |
主機(jī)參數(shù)調(diào)整:
禁用selinux
#vi/etc/sysconfig/selinux
查看是否SELINUX=disabled
關(guān)閉numa
#vi/etc/default/grub
在GRUB_CMDLINE_LINUX這一行最后添加numa=off,使其變?yōu)镚RUB_CMDLINE_LINUX=”crashkernel=auto…… rhgb quiet numa=off”,變更完成后保存退出。
#grub2-mkconfig -o /boot/grub2/grub.cfg
文件數(shù)進(jìn)程數(shù)限制
#vi /etc/security/limits.conf
添加mysql用戶限制如下:
mysqlsoft nproc 65535
mysql hard nproc 65535
mysql soft nofile65536
mysql hard nofile 65536
#vi/etc/sysctl.conf
將該配置文件內(nèi)容清空,改成以下內(nèi)容
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
創(chuàng)建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
初始化數(shù)據(jù)庫,MySQL數(shù)據(jù)目錄:
實(shí)例要?jiǎng)?chuàng)建在/data/mysql下,實(shí)例中目錄的具體劃分如下:
主目錄 | 二級(jí)目錄 | 三級(jí)目錄 |
/data/mysql/db_insname | bin(啟動(dòng)腳本目錄) | login.sh |
shutdown.sh | ||
startup.sh | ||
blog | mysql-bin.* | |
mysql-bin.index | ||
conf(配置文件目錄) | init_file.sql | |
insname.cnf | ||
data(數(shù)據(jù)目錄) | ||
elog(慢日志、錯(cuò)誤日志) | mysql.err | |
slow.log | ||
mysql.pid | ||
mysql.sock | ||
mysql.sock.lock | ||
nohup.out | ||
rlog(表空間目錄) | ib_logfile0 | |
ib_logfile1 | ||
ib_logfile2 | ||
tmp(臨時(shí)目錄) | ||
ulog(undo表空間目錄) | undo001 | |
undo002 |
配置參數(shù)說明:
參數(shù)名 | 數(shù)值 | 配置說明 |
max_connections | 5000 | 數(shù)據(jù)庫中已連接的所有用戶總數(shù)不超過5000 |
max_user_connections | 1200 | 單個(gè)用戶最大連接數(shù)不超過1200 |
connect_timeout | 10 | 建立數(shù)據(jù)庫連接時(shí)不允許超過十秒 |
wait_timeout | 600 | 狀態(tài)為sleep的線程超過600秒會(huì)被關(guān)閉 |
max_execution_time | 10000 | 執(zhí)行時(shí)間超過10000毫秒的sql語句會(huì)被終止 |
innodb_lock_wait_timeout | 10 | 事務(wù)中的DML語句10秒未獲得鎖,會(huì)回滾整個(gè)事務(wù) |
sql_safe_updates | 1 | 使用update或delete必須用where條件且使用索引 |
loose_rpl_semi_sync_master_enabled | on | 開啟半同步 |
loose_rpl_semi_sync_master_timeout | 1000 | 客戶端等待1秒得不到確認(rèn)變?yōu)楫惒?/span> |
loose_rpl_semi_sync_master_wait_for_slave_count | 1 | 主庫收到1個(gè)從庫寫成功則返回客戶端 |
loose_rpl_semi_sync_master_wait_no_slave | on | 啟動(dòng)備庫后進(jìn)入半同步模式 |
log_queries_not_using_indexes | 1 | 查詢不使用索引會(huì)計(jì)入慢日志 |
secure_file_priv | /data/mysql/db_insname/tmp | 在庫中提取數(shù)據(jù)的數(shù)據(jù)存放路徑 |
實(shí)例創(chuàng)建:
setserver.ini配置文件
10.10.1.133 /usr/local/mysql /data/mysql db test1 3306 11 root 123456 512M |
setServer_57.sh配置文件
#!/bin/bash
#目錄、端口、實(shí)例名等信息的配置文件
INI_CFG=./setServer.ini
#IP
IP=""
#軟件目錄
SOFTDIR=""
#根目錄
BASE_DIR=""
#實(shí)例名
INS_NAME=""
#實(shí)例名前綴
INS_NAME_PRE=""
#實(shí)例端口
INS_PORT=""
#server id
SERVER_ID=""
#實(shí)例根目錄
INS_BASE_DIR=""
#管理員用戶
ADMIN_USER=""
#管理員密碼
ADMIN_PASSWD=""
#實(shí)例參數(shù)文件
INS_CNF=""
#初始化SQL文件
INIT_FILE=""
#INNODB_BUFFER_POOL_SIZE設(shè)定
BUFFER_POOL=""
function Isok()
{
[ $? == "0" ] && echo "Complete OK !" || echo " Failed !!!";exit 128
}
#創(chuàng)建實(shí)例函數(shù)
function create_instance()
{
#1、創(chuàng)建實(shí)例相應(yīng)目錄
mkdir -p ${INS_BASE_DIR}/{bin,conf,data,rlog,ulog,blog,elog,tmp}
chmod -R 755 ${INS_BASE_DIR}
echo "****** 1、創(chuàng)建目錄:"
echo " 啟動(dòng)腳本目錄:${INS_BASE_DIR}/bin"
echo " 配置文件目錄:${INS_BASE_DIR}/conf"
echo " 數(shù)據(jù)目錄:${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 " 臨時(shí)目錄:${INS_BASE_DIR}/tmp"
#2、生成參數(shù)文件
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、生成參數(shù)文件:"
echo " 實(shí)例${INS_NAME}的參數(shù)文件: ${INS_CNF}"
# 3、實(shí)例化數(shù)據(jù)庫
echo "****** 3、初始化數(shù)據(jù)庫:"
#[ `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、生成啟動(dòng)、關(guān)閉、登陸腳本
echo "****** 4、生成啟動(dòng)、關(guān)閉、登陸腳本:"
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"; #復(fù)制用戶 GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO replic@% IDENTIFIED BY "4%REplic"; #業(yè)務(wù)數(shù)據(jù)監(jiān)控用戶 create user monitorjk identified by esEYq7QWkB6F2M$; #數(shù)據(jù)庫監(jiān)控用戶 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; #運(yùn)維管理用戶 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 " 密碼修改成功!" #修改配置文件,使半同步參數(shù)生效 sleep 5 sed -i s/loose_//g ${INS_CNF} sh ${INS_BASE_DIR}/bin/startup.sh echo "****** 6、網(wǎng)絡(luò)監(jiān)聽:" netstat -pltn 2>/dev/null |grep -E "Proto|$INS_PORT|mysql" echo "****** 7、MySQL錯(cuò)誤日志:" 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 "****** 實(shí)例${INS_NAME}信息: ******" echo " IP: ${IP}" echo " 軟件目錄: ${SOFTDIR}" echo " 根目錄: ${BASE_DIR}" echo " 實(shí)例根目錄: ${INS_BASE_DIR}" echo " 實(shí)例名前綴: ${INS_NAME_PRE}" echo " 實(shí)例名: ${INS_NAME}" echo " 實(shí)例端口: ${INS_PORT}" echo " server_id: ${SERVER_ID}" echo " 管理員用戶: ${ADMIN_USER}" echo " 管理員密碼: ${ADMIN_PASSWD}" echo " INNODB_BUFFER_POOL_SIZE設(shè)定: ${BUFFER_POOL}" if [ `echo ${line} | awk {print NF}` != "10" ]; then echo "ERROR:創(chuàng)建實(shí)例相應(yīng)參數(shù)不夠!" echo "##############################################################################################" echo -e "
" #判斷端口與ibdata01文件是否存在,都不存在則創(chuàng)建實(shí)例。存在一個(gè)則創(chuàng)建失敗 elif [ X"`netstat -ltn | grep ${INS_PORT}`" = X"" ] && [ ! -f ${INS_BASE_DIR}/data/ibdata01 ]; then #調(diào)用創(chuàng)建實(shí)例函數(shù) create_instance; else echo "ERROR:端口${INS_PORT}或${INS_BASE_DIR}/data/ibdata01文件存在,創(chuàng)建實(shí)例失敗!" echo "##############################################################################################" echo -e "
" fi done else echo "ERROR:${INI_CFG}配置文件不存在!" exit 1 fi
數(shù)據(jù)庫的初始化使用上面兩個(gè)腳本完成。
1.填寫setserver.ini配置文件。
2.執(zhí)行setserver.sh,初使化數(shù)據(jù)庫。
setserver.ini,填寫方法如下:
序列 | 名稱 | 示例 |
第1列 | ip | 0.0.0.1 |
第2列 | 軟件目錄 | /usr/local/mysql |
第3列 | 數(shù)據(jù)根目錄 | /data/mysql |
第4列 | 實(shí)例名前綴 | Db |
第5列 | 實(shí)例名 | Insname |
第6列 | 端口 | 20001 |
第7列 | serverid(如果有兩個(gè)節(jié)點(diǎn),serverid不能一樣,一個(gè)寫01一個(gè)寫02) | port+01/port+02 |
第8列 | root賬號(hào) | Root |
第9列 | root密碼 | Root |
setserver.sh
用mysql用戶執(zhí)行腳本完成數(shù)據(jù)庫實(shí)例初始化。
登錄數(shù)據(jù)庫
數(shù)據(jù)庫登錄腳本在/data/mysql/db_InsName/bin下,login.sh。
復(fù)制方式:半同步、主主復(fù)制
操作步驟:
登陸節(jié)點(diǎn)1:
步驟 | 操作 | 解釋 |
1 | mysql>RESET MASTER; | 重置 |
2 | mysql>CHANGE MASTER TO | 配置主主 |
3 | mysql>START SLAVE; | 啟動(dòng)服務(wù) |
登陸節(jié)點(diǎn)2:
步驟 | 操作 | 解釋 |
1 | mysql>RESET MASTER; | 重置 |
2 | mysql>CHANGE MASTER TO | 配置主主 |
3 | mysql>START SLAVE; | 啟動(dòng)服務(wù) |
集群中的每一個(gè)MySQL實(shí)例都多帶帶部署在一個(gè)物理機(jī),考慮到容錯(cuò)和網(wǎng)絡(luò)環(huán)境盡量實(shí)現(xiàn)跨機(jī)柜部署。
禁止集群的一對主從部署在同一臺(tái)物理機(jī)。
MySQL不應(yīng)和高磁盤I/O,高計(jì)算任務(wù)的應(yīng)用部署在同一臺(tái)物理機(jī)上
軟件名稱 | 版本號(hào) |
Keepalived | Keepalived-1.3.2 |
安裝目錄規(guī)范:
軟件安裝目錄:/usr/local/keepalived
日志輸出目錄:/usr/local/keepalived/log/keepalived.log
配置文件目錄:/etc/keepalived/keepalived.conf
檢測腳本目錄:/etc/keepalived/scripts/
參數(shù)文件目錄:/etc/sysconfig/keepalived
執(zhí)行文件目錄:/usr/sbin/keepalived
啟動(dòng)文件目錄:/etc/rc.d/init.d/keepalived
源碼存放目錄:/tmp/keepalived-1.3.2/
keepalived安裝:
在root用戶權(quán)限下執(zhí)行:
rpm-qa make gcc libpopt-dev libnl-dev libcurl4-openssl-dev | grep "notinstall"
查看是否存在未安裝的依賴包。(注意:當(dāng)操作系統(tǒng)語言為中文時(shí)需注意,notinstall篩選不出結(jié)果,可自行查看是否存在對應(yīng)依賴包。)
如果存在未安裝的依賴包,則對缺失的依賴包進(jìn)行安裝。
tar zxf keepalived-1.3.2.tar.gz,進(jìn)入目錄并編譯
在編譯過程中,只需要執(zhí)行安裝目錄,其他使用默認(rèn)配置即可。
./configure –prefix=/usr/local/keepalived
make && make install
在keepalived1.3.2中,部分系統(tǒng)所需使用的腳本文件在源碼安裝包中,即腳本存在位置為:/tmp/keepalived-1.3.2/keepalived/etc。
復(fù)制可執(zhí)行文件:
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
復(fù)制系統(tǒng)服務(wù)文件:
cp/tmp/keepalived-1.3.2/keepalived/etc/init.d/keepalived /etc/rc.d/init.d/
復(fù)制參數(shù)文件:
cp/usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
創(chuàng)建配置文件/腳本文件目錄:
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啟動(dòng)參數(shù)文件
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服務(wù)
systemctl restart rsyslog
參數(shù)說明:
參數(shù)名 | 配置說明 |
vrrp_script塊 | keepalived調(diào)用檢測腳本塊 |
script | 檢測腳本文件指定 |
ineerval | 檢測腳本調(diào)用周期 |
vrrp_instance塊 | keepalivd配置塊 |
state | keepalived角色狀態(tài),只有MASTER和BACKUP兩種,必須使用大寫 |
interface | keepalived實(shí)例綁定網(wǎng)卡 |
virtual_router_id | 實(shí)例ID,用于主備之間互通,主備必須相同,值范圍:0-255 |
priority | 權(quán)重值 |
advert_int | keepalived之間心跳檢測時(shí)間間隔 |
nopreempt | 設(shè)置不搶占 |
track_script | 選擇檢測腳本塊 |
authentication | 認(rèn)證設(shè)置 |
auth_type | 認(rèn)證方式 |
auth_pass | 認(rèn)證密碼,最大不可超過8位 |
virtual_ipaddress | 設(shè)置服務(wù)IP |
vrrp_garp_master_refresh | Master發(fā)一次ARP包到網(wǎng)關(guān)的間隔時(shí)間,可以防止產(chǎn)生腦裂 |
配置文件展示:
global_defs {
vrrp_garp_master_refresh10 #Master間隔10s發(fā)一次ARP包到網(wǎng)關(guān)
}
vrrp_scriptcheck_run {
script"/etc/keepalived/scripts/keepalived_check_mysql.sh"#
需手工修改文件中的mysql端口號(hào)
interval30
weight0
}
vrrp_instanceVI_1 {
stateBACKUP
interfaceteam0 # 網(wǎng)卡,根據(jù)實(shí)際情況填寫
virtual_router_id155 # 推薦使用虛IP第四段數(shù)字
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數(shù)據(jù)庫VIP切換操作步驟 | ||||
序號(hào) | 主任務(wù) | 子任務(wù) | 操作節(jié)點(diǎn) | 操作命令 |
1 | VIP切換前準(zhǔn)備 | 檢查數(shù)據(jù)庫同步狀態(tài) | 主從節(jié)點(diǎn) | show slave statusG |
2 | 檢查數(shù)據(jù)庫日志 | 主從節(jié)點(diǎn) | tail -1000f /data/db_{實(shí)例名}/elog/mysql.err | |
3 | 檢查keepalived狀態(tài) | 主從節(jié)點(diǎn) | ps -ef |grep -i keepalived | |
4 | VIP切換階段 | 設(shè)置read_only為on | 主節(jié)點(diǎn) | set global read_only=on; |
5 | kill應(yīng)用連接 | 主節(jié)點(diǎn) | kill processid; | |
6 | 切換VIP | 主節(jié)點(diǎn) | sudo systemctl stop keepalived | |
7 | 檢查VIP是否切換成功 | 主從節(jié)點(diǎn) | ip a | |
8 | 檢查應(yīng)用連接 | 主從節(jié)點(diǎn) | show processlist; | |
9 | 檢查同步狀態(tài) | 主從節(jié)點(diǎn) | show slave statusG | |
10 | 設(shè)置read_only為off | 新主節(jié)點(diǎn) | set global read_only=off; |
說明:為保障MySQL數(shù)據(jù)庫數(shù)據(jù)的一致性,防止keepalived虛擬IP節(jié)點(diǎn)漂移次數(shù)過于頻繁,在state中設(shè)置為雙BACKUP,即主從均為BACKUP,此時(shí),如果主機(jī)出現(xiàn)故障或宕機(jī),從機(jī)檢測到之后,接管VIP,并繼續(xù)提供服務(wù)。主機(jī)恢復(fù),仍不會(huì)爭用VIP,直至下次從機(jī)出現(xiàn)故障宕機(jī),VIP才會(huì)進(jìn)行第二次漂移,恢復(fù)到原主機(jī),繼續(xù)提供服務(wù)。該設(shè)置避免頻繁切換數(shù)據(jù)庫節(jié)點(diǎn),導(dǎo)致數(shù)據(jù)的不一致。
當(dāng)提供服務(wù)的一臺(tái)出現(xiàn)故障的時(shí)候,另外一臺(tái)會(huì)馬上自動(dòng)接管并且提供服務(wù),而且切換的時(shí)間非常短,mysql雙主復(fù)制,即互為Master-Slave(只有一個(gè)Master提供寫操作),可以實(shí)現(xiàn)數(shù)據(jù)庫服務(wù)器的熱備,但是一個(gè)Master宕機(jī)后不能實(shí)現(xiàn)動(dòng)態(tài)切換。使用Keepalived,可以通過虛擬IP,實(shí)現(xiàn)雙主對外的統(tǒng)一接口以及自動(dòng)檢查、失敗切換機(jī)制,基本不需要人工干預(yù)操作,從而實(shí)現(xiàn)MySQL數(shù)據(jù)庫的高可用性。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/130214.html
摘要:假設(shè)反向代理層是,里能夠配置多個(gè)后端,并且能夠探測到多個(gè)后端的存活性。以為例,天然支持主從同步,官方也有哨兵機(jī)制,來做的存活性檢測。方法論上,高可用是通過冗余自動(dòng)故障轉(zhuǎn)移來實(shí)現(xiàn)的。 究竟啥才是互聯(lián)網(wǎng)架構(gòu)高可用 一、什么是高可用 高可用HA(High Availability)是分布式系統(tǒng)架構(gòu)設(shè)計(jì)中必須考慮的因素之一,它通常是指,通過設(shè)計(jì)減少系統(tǒng)不能提供服務(wù)的時(shí)間。假設(shè)系統(tǒng)一直能夠提供服...
摘要:在協(xié)議實(shí)現(xiàn)里,虛擬路由器使用作為虛擬地址,就是唯一的,這個(gè)地址同一時(shí)間只有一個(gè)物理路由器占用。在虛擬路由器里面的物理路由器組里面通過多播地址來定時(shí)發(fā)送通告消息。負(fù)責(zé)健康檢查,包括常見的各種檢查方式。 公司內(nèi)部 OA 系統(tǒng)要做線上高可用,避免單點(diǎn)故障,所以計(jì)劃使用2臺(tái)虛擬機(jī)通過 Keepalived 工具來實(shí)現(xiàn) nginx 的高可用(High Avaiability),達(dá)到一臺(tái)nginx...
摘要:雙主是一個(gè)比較簡單的高可用架構(gòu),適用于中小集群,今天就說說怎么用做的高可用。缺點(diǎn)也比較明顯,就是增加從節(jié)點(diǎn)的情況下,從節(jié)點(diǎn)不會(huì)主動(dòng)切換同步對象,而且腳本需要自己實(shí)現(xiàn),有一定風(fēng)險(xiǎn)。 雙主 + keepalived 是一個(gè)比較簡單的 MySQL 高可用架構(gòu),適用于中小 MySQL 集群,今天就說說怎么用 keepalived 做 MySQL 的高可用。 1 概述 1.1 keepalive...
閱讀 1350·2023-01-11 13:20
閱讀 1694·2023-01-11 13:20
閱讀 1151·2023-01-11 13:20
閱讀 1869·2023-01-11 13:20
閱讀 4107·2023-01-11 13:20
閱讀 2730·2023-01-11 13:20
閱讀 1392·2023-01-11 13:20
閱讀 3611·2023-01-11 13:20