Mysql 安装部署并搭建主从关系

178 阅读8分钟

Mysql的安装,主从搭建,集群搭建,断开修复

一. 安装

1.添加用户

# 创建用户
useradd mysql
# 设置密码
passwd mysql

Tips: home目录下,存放的是对应用户的目录文件夹.比如 添加了mysql用户,在home目录下就会有一个对应的命名为mysql的文件夹

2.下载mysql文件

# 下载对应版本的mysql数据库
curl -O https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz
# 解压文件
tar -xf mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz
# 重命名文件夹
mv mysql-8.0.20-linux-glibc2.12-x86_64 mysql-3306

3.复制多个数据库

# 复制 mysql-3306 文件夹, 粘贴为 mysql-3307 文件夹
cp -r mysql-3306 mysql-3307

4.配置my.cnf

在数据库目录下创建文件,命名为my.cnf

4.1 主库配置

[client]
socket=/home/mysql/mysql-3306/mysql.sock

[mysqld]
basedir=/home/mysql/mysql-3306
datadir=/home/mysql/mysql-3306/data
port = 3306
socket=/home/mysql/mysql-3306/mysql.sock

#主库配置
## 必须不一致
server-id=01
## 二进制日志
log-bin=mysql-bin
## 忽略数据库(主从复制忽略该数据库)
binlog-ignore-db=mysql
## 指定数据库
binlog-do-db=369
max_connect_errors=1000

[mysql]
socket=/home/mysql/mysql-3306/mysql.sock

[mysqldump]
socket=/home/mysql/mysql-3306/mysql.sock

[mysqladmin]
socket=/home/mysql/mysql-3306/mysql.sock

symbolic-links=0

log-error=/home/mysql/mysql-3306/log/mysqld.log
pid-file=/home/mysql/mysql-3306/mysqld.pid

4.2 从库配置

[client]
socket=/home/mysql/mysql-3306/mysql.sock

[mysqld]
basedir=/home/mysql/mysql-3307
datadir=/home/mysql/mysql-3307/data
port = 3307#必须不一致
socket=/home/mysql/mysql-3307/mysql.sock
server-id=02 #必须不一致
max_connect_errors=1000

[mysql]
socket=/home/mysql/mysql-3307/mysql.sock

[mysqldump]
socket=/home/mysql/mysql-3307/mysql.sock

[mysqladmin]
socket=/home/mysql/mysql-3307/mysql.sock

symbolic-links=0

log-error=/home/mysql/mysql-3307/log/mysqld.log
pid-file=/home/mysql/mysql-3307/mysqld.pid

注意: 主从配置的主要区别在于[mysqld]下的配置, 一定要保证端口portserver_id的唯一性.不可重复

5.设置数据库的操作权限

将数据库目录设置权限为最高777;

如 mysql-3306 ,mysql-3307目录

6.初始化数据库

在各个数据库目录下创建data文件夹(用于存放数据),和tmp 文件夹(存放临时文件);

mkdir data
mkdir tmp

注意:

  1. 保证data目录是个新的文件夹,里面不能有任何文件
  2. 初始化完成之后一定保管好临时密码.
./mysqld --defaults-file=/home/mysql/mysql-3306/my.cnf --initialize --user=mysql
  1. 该命令执行完,即会产生临时密码,注意保管
  2. 不同的数据库,注意文件路径是否正确
# 注意路径中的文件名是否正确
./mysql_ssl_rsa_setup --defaults-file=/home/mysql/mysql-3306/my.cnf

7.启动数据库服务

./mysqld_safe --defaults-file=../my.cnf
  1. 该指令启动成功后,窗口便不能执行,任何指令,需要复制会话窗口,继续执行后续操作
  2. 如果执行失败,会出现*****.pid end ,要去data目录下,查看一个后缀为err的文件,排查原因.
    • 常见原因有两种
      1. 数据库目录的权限没有提升至777;在启动服务时,会在数据库目录下写入mysql.sock的文件夹,和mysql.sock.lock的文件,如果权限不足,会导致写入失败,从而数据库服务也启动失败
      2. 已经存在相同的进程了.通过使用指令ps -aux|grep mysql 来验证;如果不能解决问题,可直接执行pkill mysql,杀死mysql全部进程

8.登录数据库

登录数据库之后,主库和从库的操作不同,需要注意

./mysql --socket=../mysql.sock -u root -p

主库和从库都进行

# 修改临时密码
alter user 'root'@'localhost' identified by '123456';
# 切换到`mysql`数据库
use mysql;
# 修改root用户在所有host地址都可连接,可简单理解为允许远程连接
update user set user.Host='%' where user.User='root';
# 设置root 用户 密码永不过期
ALTER USER 'root'@'%' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER;
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
# 刷新权限
flush privileges;
# 退出登录
quit

仅主库操作

# 创建账号,分发给从库,用于主从复制
CREATE USER '同步账号'@'%' IDENTIFIED WITH 'mysql_native_password' BY '同步密码';
# 给该账号授予权限
GRANT replication slave ON *.* TO '同步账号'@'%';
# 刷新权限
flush privileges;

二. 主从搭建

主库操作

查看主库状态

# 刷新日志
mysql> flush logs;

# 查看主库状态
mysql> show master status\G;

*************************** 1. row ***************************
             File: mysql-bin.000001
         Position: 156
     Binlog_Do_DB: test
 Binlog_Ignore_DB: mysql
Executed_Gtid_Set: 
1 row in set (0.00 sec)

注意:主要查看两个信息

  1. 日志文件名称: master_log_file="mysql-bin.000001",
  2. 日志文件位置: master_log_pos=156;

从库操作

建立主从关系

change master to
# host 是 主库的 ip 地址
master_host="127.0.0.1*",
# 主库创建并授权分发给从库的账号
master_user="slave_user",
# 账号的密码
master_password="slave_user_password",
# 主库show master status 获取到的两个信息
master_log_file="mysql-bin.000001",
master_log_pos=156;

启动从机

start slave

查看从机状态

mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
               #### 主机的IP
                  Master_Host: 192.168.0.111
               #### 账号
                  Master_User: slave_user
               #### 主库端口
                  Master_Port: 3306
                Connect_Retry: 60
               #### 主库日志
              Master_Log_File: mysql-bin.000103
     					... ...  ... ... ...
               #### 看到以下两个Yes 代表主从配置成功
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
      					... ...  ... ... ...
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
  					... ...  ... ... ...
            Network_Namespace: 
1 row in set (0.03 sec)

三.集群搭建

haproxy 是mysql数据库集群

1. 下载haproxy:

www.haproxy.org/download/1.…

2. 解压:

tar zxvf haproxy-1.8.12.tar.gz
cd haproxy-1.8.12

3. 编译与安装:

安装

::: tip

#参数说明: #TARGET:使用uname -r查看内核,如:2.6.18-371.el5,此时该参数就为linux26。kernel 等于2.6.28的用:TARGET=linux2628,等等。 #CPU:使用uname -r查看系统信息,如x86_64 GNU/Linux,此时该参数就为x86_64。 #PREFIX:指定haprpxy安装路径。

:::

make TARGET=linux3100 CPU=x86_64 PREFIX=/usr/local/haprpxy
make install PREFIX=/usr/local/haproxy

4. 设置HAProxy:

::: warning

​ 如果要复制该段,需要将指令中的 haproxy的安装位置,改为自己系统上的位置;

​ 每一句shell指令都要保证提示执行成功,建议一步一步操作

:::

mkdir -p /usr/local/haproxy/conf #创建配置文件目录
mkdir -p /etc/haproxy #创建配置文件目录
touch /usr/local/haproxy/conf/haproxy.cfg #创建配置文件
ln -s /usr/local/haproxy/conf/haproxy.cfg /etc/haproxy/haproxy.cfg #添加配置文件软连接
cp -r /home/haproxy/haproxy-1.8.12/examples/errorfiles /usr/local/haproxy/errorfiles #拷贝错误页面
ln -s /usr/local/haproxy/errorfiles /etc/haproxy/errorfiles #添加软连接
mkdir -p /usr/local/haproxy/log #创建日志文件目录
touch /usr/local/haproxy/log/haproxy.log #创建日志文件
ln -s /usr/local/haproxy/log/haproxy.log /var/log/haproxy.log #添加软连接
cp /home/haproxy/haproxy-1.8.12/examples/haproxy.init /etc/rc.d/init.d/haproxy #拷贝开机启动文件
chmod +x /etc/rc.d/init.d/haproxy #添加脚本执行权限
chkconfig haproxy on #设置开机启动
ln -s /usr/local/haproxy/sbin/haproxy /usr/sbin #添加软连接

5.配置haproxy.cfg参数:

::: details 点击查看

global
    log         127.0.0.1 local2           # 日志定义级别(err | warning | info | debug)
    chroot      /usr/local/haproxy         # 当前工作目录
    pidfile     /var/run/haproxy.pid       # 进程id
    maxconn     4000                       # 最大连接数
    user        haproxy                    # 运行改程序的用户
    group       haproxy
    daemon                                 # 后台形式运行
    stats socket /usr/local/haproxy/stats

defaults
    mode                    tcp            # haproxy运行模式(http | tcp | health)
    log                     global         # 采用全局定义的日志
    option                  dontlognull    # 不记录健康检查的日志信息
    option                  redispatch     # serverId对应的服务器挂掉后,强制定向到其他健康的服务器
    retries                 3              # 三次连接失败则服务器不用
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s            # 连接超时
    timeout client          1m             # 客户端超时
    timeout server          1m             # 服务器超时
    timeout http-keep-alive 10s
    timeout check           10s            # 心跳检测
    maxconn                 600            # 最大连接数

listen stats                               # 配置haproxy状态页(用来查看的页面)
    mode http
    bind :8888
    stats enable
    stats hide-version                     # 隐藏haproxy版本号
    stats uri     /haproxyadmin?stats      # 一会用于打开状态页的uri
    stats realm   Haproxy\ Statistics      # 输入账户密码时的提示文字
    stats auth    admin:369Vip369.com      # 用户名:密码

frontend  main 
    bind 0.0.0.0:6603
    # 使用6603端口。监听前端端口(表示任何ip访问6603端口都会将数据轮番转发到mysql服务器群组中)
    default_backend             mysql      # 后端服务器组名

backend mysql
    balance     roundrobin                 # 使用轮询方式调度
    server mysql1 188.19.96.171:3307 check port 3307 maxconn 300
    server mysql2 188.19.96.171:3308 check port 3308 maxconn 300
    server mysql3 188.19.96.171:3309 check port 3309 maxconn 300
    server mysql4 188.19.96.171:3310 check port 3310 maxconn 300
    server mysql5 188.19.96.171:3306 check port 3306 maxconn 300

:::

6.常用指令:

systemctl start haproxy
systemctl status haproxy -l
systemctl stop haproxy
systemctl restart haproxy

7.测试访问:

如果服务器是阿里云服务器,记得开放安全组端口

http://服务器ip:端口号/haproxyadmin?stats

8.配置文件地址:

/usr/local/haproxy/conf

9.日志地址:

/var/log/haproxy.log

四.断开修复

前言 实际开发中会遇到,主从断开的情况,那么该如何修复呢?其实修复的本质就是让从库和主库重新建立连接.

建议 主从的修复涉及sql导入数据,这个需要大量的时间,如果有时急需程序正常运转,可先尝试跳过当前导致主从错误的同步操作,问题解决即可.若问题没有解决,数据还是不能正常同步再进行,完全的主从重连操作.

一. 跳过错误

stop slave;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1 ;       
start slave;

::: tip 提示

sql中的数字代表跳过的事务数量. 若一个事务数量不能同步,可尝试加大数字

:::

::: warning 建议

每执行一次sql都要再查看一次主从状态,直到同步为止.

:::

二. 重新连接

1. 关闭slave

stop slave;

2. 同步数据

:::tip 提示

主库中导出数据,可借助可视化工具,如SQL_yon,navicat导出可执行的sql文件

:::

  • 切换数据库
use database_name
  • 同步数据
source sql文件位置
eg: source /123.sql  # 表示根目录下的`123.sql` 文件

3. 查看主库状态

  • 刷新日志
flush logs;
  • 查看主库状态
show master status\G;

4. 建立主从关系

# 以下内容可供复制
change master to
master_host="127.0.0.1*",
master_user="slave_user",
master_password="slavepassword",
master_log_file="mysql-bin.000019",
master_log_pos=322;

开启slave

start slave;

查看slave状态

show slave status\G;

看到以下两个状态都为Yes,则表示主从关系修复成功了.

  Slave_IO_Running: Yes
  Slave_SQL_Running: Yes