日度归档:2021-03-25

CentOS新装系统的后续工作

对于新装 CentOS 系统,我个人会通常做以下工作

1.换源

我一般换 中国科学技术大学镜像源 ,因为阿里源、华为源都放过我鸽子XDDD

2.基础环境

sudo yum install gcc gcc-c++ pcre openssh openssh-devel openssl openssl-devel libtools cmake autoconf tcl ntpdate -y

# 升级内核和所有软体
sudo yum update -y

3.同步时间服务器(server time.ustc.edu.cn)

[root@basic-platform ~]# cat /etc/ntp.conf | grep -v "^#" | grep -v "^$"
driftfile /var/lib/ntp/drift
restrict default nomodify notrap nopeer noquery
restrict 127.0.0.1
restrict ::1
server time.ustc.edu.cn
includefile /etc/ntp/crypto/pw
keys /etc/ntp/keys
disable monitor

[root@basic-platform ~]# systemctl start ntpdate.service

部署 MySQL/Mariadb 主从复制

MariaDB Foundation - MariaDB.org

本文主要介绍 MySQL/Mariadb 主从复制部署过程,主从复制原理请看这里

一、实验环境

  • 作业系统:CentOS 7.7
  • mariadb version:10.5.0
服务器角色IP地址主机名应用程式
Master172.50.1.107nacos-mha-s1mariadb
Slave1172.50.1.108nacos-mha-s2mariadb
Slave2172.50.1.109nacos-mha-s3mariadb

二、部署Maridb

三台服务器都要 部署mariadb

三、主从配置

可根据实际情况是否开启半同步配置

配置文件路径:/etc/my.cnf.d/server.cnf

  • master节点
[mariadb]
log-bin
server_id=1
log-basename=master
binlog-format=mixed
relay_log_purge=0  # 关闭中继日志

##### 以下配置为开启 master 半同步复制 #####

rpl_semi_sync_master_enabled=ON
rpl_semi_sync_master_timeout=5000

##### 以上配置为开启 master 半同步复制 #####
  • slave1 节点
[mariadb]
log-bin
server_id=2
log-basename=slave1
binlog-format=mixed
relay_log_purge=0  # 关闭中继日志

##### 以下配置为开启 slave 半同步复制 #####

rpl_semi_sync_slave_enabled=ON

##### 以上配置为开启 slave 半同步复制 #####
  • slave2 节点
[mariadb]
log-bin
server_id=3
log-basename=slave2
binlog-format=mixed
relay_log_purge=0  # 关闭中继日志

##### 以下配置为开启 slave 半同步复制 #####

rpl_semi_sync_slave_enabled=ON

##### 以上配置为开启 slave 半同步复制 #####
  • 三台服务器都要重新启动 mariadb 服务
sudo systemctl restart mariadb.service

四、获取 master 节点 binary log(二进制日志)postion

  • 在 master 节点上,通过mysql -u root -p进入 MySQL 终端,记录 File Position 字段的值
MariaDB [(none)]> SHOW MASTER STATUS;
+--------------------+----------+--------------+------------------+
| File               | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+--------------------+----------+--------------+------------------+
| master-bin.000001  |      330 |              |                  |
+--------------------+----------+--------------+------------------+
1 row in set (0.000 sec)
  • 继续在 master 节点上创建主从复制专有用户并授权
CREATE USER 'replication'@'%' IDENTIFIED BY 'Admin123';
GRANT REPLICATION SLAVE ON *.* TO 'replication'@'%';
FLUSH PRIVILEGES;

五、启动 Slave

  • 分别在 Slave 节点上,执行以下语句(为 Slave 指定 Master)
MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='172.50.1.107', MASTER_USER='replication', MASTER_PASSWORD='Admin123', MASTER_PORT=3306, MASTER_LOG_FILE='master-bin.000001', MASTER_LOG_POS=330, MASTER_CONNECT_RETRY=10;
  • 在 Slave 节点上 启动 Slave
MariaDB [(none)]> START SLAVE;
  • 在 Slave 节点上 查看 状态 (出现以下 两个 YES 表示成功)
MariaDB [(none)]> SHOW SLAVE STATUS \G
*************************** 1. row ***************************
         
              .........省略.........

              Slave_IO_Running: Yes
             Slave_SQL_Running: Yes
          
              .........省略.........

1 row in set (0.001 sec)

六、docker-compose版部署

docker-compose.yaml配置文件

version: '3'
services:
  mysql_master:
    image: mysql:5.7.21
    container_name: MessageCenter_MySQL_Master
    ports:
      - 3307:3306
    environment:
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: Admin123
    volumes:
      - /data/MessageCenter_MySQL/master/mysql/mysql.conf.d:/etc/mysql/mysql.conf.d
      - /data/MessageCenter_MySQL/master/mysql/lib/mysql:/var/lib/mysql
      - /etc/localtime:/etc/localtime:ro
      - /data/MessageCenter_MySQL/master/mysql/log:/var/log/mysql
    restart: always
	
  mysql_slave1:
    image: mysql:5.7.21
    container_name: MessageCenter_MySQL_Slave1
    ports:
      - 3308:3306
    environment:
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: Admin123
    volumes:
      - /data/MessageCenter_MySQL/slave1/mysql/mysql.conf.d:/etc/mysql/mysql.conf.d
      - /data/MessageCenter_MySQL/slave1/mysql/lib/mysql:/var/lib/mysql
      - /etc/localtime:/etc/localtime:ro
      - /data/MessageCenter_MySQL/slave1/mysql/log:/var/log/mysql
    restart: always
	
  mysql_slave2:
    image: mysql:5.7.21
    container_name: MessageCenter_MySQL_Slave1
    ports:
      - 3309:3306
    environment:
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: Admin123
    volumes:
      - /data/MessageCenter_MySQL/slave2/mysql/mysql.conf.d:/etc/mysql/mysql.conf.d
      - /data/MessageCenter_MySQL/slave2/mysql/lib/mysql:/var/lib/mysql
      - /etc/localtime:/etc/localtime:ro
      - /data/MessageCenter_MySQL/slave2/mysql/log:/var/log/mysql
    restart: always

my.cnf配置文件样本(注意修改server_id和read-only的值)

[client]
default-character-set = utf8
port = 3306

[mysql]
port = 3306
default-character-set = utf8

[mysqld]
port = 3306
character-set-server = utf8
log-bin = mysql-bin
binlog_cache_size = 1M
expire_logs_days = 10
max_binlog_size = 128M
server_id=1
binlog_format=MIXED
read-only=0
replicate-ignore-db=mysql
replicate-ignore-db=sys
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema
skip-external-locking
lower_case_table_names = 1
max_connections=1000
max_user_connections=100
max_connect_errors=1000
innodb_buffer_pool_size = 100M
innodb_buffer_pool_instances = 8
innodb_log_file_size = 200M
innodb_log_buffer_size = 16M
innodb_log_files_in_group = 3
innodb_flush_log_at_trx_commit = 0
innodb_lock_wait_timeout = 10
innodb_sync_spin_loops = 40
innodb_max_dirty_pages_pct = 90
innodb_support_xa = 0
innodb_thread_concurrency = 0
innodb_thread_sleep_delay = 500
innodb_concurrency_tickets = 1000
log_bin_trust_function_creators = 1
innodb_flush_method = O_DIRECT
innodb_file_per_table
innodb_read_io_threads = 16
innodb_write_io_threads = 16
innodb_io_capacity = 2000
innodb_file_format = Barracuda
innodb_purge_threads=1
innodb_purge_batch_size = 32
innodb_old_blocks_pct=75
innodb_change_buffering=all
innodb_stats_on_metadata=OFF
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

使用MHA实现MySQL/MariaDB高可用

本篇介绍MHA部署过程,MHA工作原理请看 这里

一、作业环境

  • 作业系统:CentOS 7.7
服务器角色 IP地址 主机名 应用程式分布
MHA Manager 172.50.1.119 basic-platform Manager, node, mariadb
MHA Node & MySQL Master 172.50.1.107 nacos-mha-s1 node, mariadb
MHA Node & MySQL Slave1 172.50.1.108 nacos-mha-s2 node, mariadb
MHA Node & MySQL Slave2 172.50.1.109 nacos-mha-s3 node, mariadb

二、让我们开始吧

MHA 安装包托管在 Google Code 上,也可在 GitHub 上下载 mha-managermha-node 安装包

1.依赖环境

如果你准备的是一台全新的服务器,建议对服务器进行常用基础环境包的安装

  • MHA 是用 Perl 编写的,需要安装 Perl 依赖 ( Tips: 如果你的服务器在中国,那么建议将 YUM 源设置成 中国科学技术大学源,如何设置请点击 这里)
# MHA Manager 和 MHA node 服务器都需要执行
sudo yum install perl-DBD-MySQL perl-Parallel-ForkManager perl-Log-Dispatch  perl-Config-Tiny -y

2.安装 Manager 节点

# manager 节点上也需要安装 mha-node 组件
sudo yum install mha4mysql-node-0.58-0.el7.centos.noarch.rpm
sudo yum install mha4mysql-manager-0.58-0.el7.centos.noarch.rpm

3.安装 Node 节点

# mysql / mariadb 服务器上都需要安装 mha-node 组件,本实验环境总共 3 台服务器
sudo yum install mha4mysql-node-0.58-0.el7.centos.noarch.rpm

4.配置MHA Manager

  • 首先登陆 Mariadb Master, 创建 mha 用户并授权
CREATE USER 'mha'@'%' IDENTIFIED BY 'Admin123';
GRANT ALL ON *.* TO 'mha'@'%';
FLUSH PRIVILEGES;
  • 然后登陆 MHA Manager 服务器,创建 MHA Manager 配置文件 /etc/mha/mha.cnf ,写入以下内容
[server default]
user=mha
password=Admin123
repl_user=replication  # 特别指出:这是 Mariadb 主从复制账号
repl_password=Admin123 # 特别指出:这是 Mariadb 主从复制密码
ssh_user=root
manager_workdir=/opt/mha
manager_log=/var/log/mha/mha.log
remote_workdir=/opt/mha
ping_interval=3
[server1]
# Master
hostname=172.50.1.107
[server2]
# Slave One
hostname=172.50.1.108
[server3]
# Slave Two
hostname=172.50.1.109
  • 生成密钥对,使得 MHA Manager 通过 SSH 密钥登陆 Mariadb 服务器,三台 Mariadb 服务器也可互相登陆(四台机器都需要执行)
# 1.四台服务器(一台 MHA Manager, 三台 Mariadb 都需要执行)
# 2.建议用 root 用户在 /root 目录下执行以下命令
# 3.为了图方便,每台服务器自身都做了 ssh 登陆,其实这是不严谨的
sudo ssh-keygen -t rsa
sudo ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.50.1.107 
sudo ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.50.1.108
sudo ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.50.1.109
sudo ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.50.1.119

5.校验配置是否成功

# 在 MHA Manager 服务器上,执行以下命令,进行校验配置
# 校验SSH,需要出现All SSH connection tests passed successfully代表成功。
sudo masterha_check_ssh --conf=/etc/mha/mha.cnf
# 校验主从复制,需要出现MySQL Replication Health is OK代表成功。
sudo masterha_check_repl --conf=/etc/mha/mha.cnf

6.启动 MHA 监测集群

# 校验配置成功之后,在 MHA Manager 服务器上启动 MHA 监测集群
sudo nohup masterha_manager --conf=/etc/mha/mha.cnf < /dev/null > /var/log/mha/mha.log 2>&1 &

7.查看 MHA 监测集群服务状态

sudo masterha_check_status --conf=/etc/mha/mha.cnf

8.停止 MHA 监测集群服务

sudo masterha_check_stop --conf=/etc/mha/mha.cnf

MHA架构介绍与工作原理

一、简介

MHA (Master High Availability) 目前是 MySQL 高可用相对成熟的解决方案之一,它由日本DeNA公司 youshimaton(现就职于Facebook公司)开发,是一套优秀的故障切换、主从提升的高可用软件。在 MySQL 故障切换过程中,MHA能做到0~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能最大程度上保证数据库的一致性,以达到真正意义上的高可用。基于标准的MySQL复制(异步/半同步)。


MHA有两部分组成: MHA Manager (管理节点) 和 MHA Node (数据节点)。


MHA Manager 可以单独部署在一台独立机器上管理多个 master-slave 集群,也可以部署在一台 MySQL Slave 上,MHA Manager 探测集群的node节点,当发现 master 出现故障的时候,它可以自动将具有最新数据的slave提升为新的master,然后将所有其它的slave导向新的master上,整个故障转移过程对应用程序是透明的。

二、工作原理

官方文档

架构原理图:

  • 从宕机崩溃的Master上保存二进制日志事件(binlog event);
  • 识别含有最新更新的Slave;
  • 应用差异的中继日志(relay log)到其他Slave;
  • 应用从Master保存的二进制日志事件;
  • 提升一个Slave为新的Master;
  • 使其他的Slave连接新的Master进行复制;

三、MHA软件包

MHA软件由两部分组成,Manager工具包和Node工具包,具体如下。

  1. Manager工具包:
  • masterha_check_ssh:检查MHA的SSH配置情况。
  • masterha_check_repl:检查MySQL复制状况。
  • masterha_manager:启动MHA。
  • masterha_check_status:检测当前MHA运行状态。
  • masterha_master_monitor:检测Master是否宕机。
  • masterha_master_switch:控制故障转移(自动或手动)。
  • masterha_conf_host:添加或删除配置的server信息。
  1. Node工具包(通常由MHA Manager的脚本触发,无需人工操作):
  • save_binary_logs:保存和复制Master的binlog日志。
  • apply_diff_relay_logs:识别差异的中级日志时间并将其应用到其他Slave。
  • filter_mysqlbinlog:去除不必要的ROOLBACK事件(已经废弃)
  • purge_relay_logs:清除中继日志(不阻塞SQL线程)

四、模拟主库failover(故障转移)场景