vlambda博客
学习文章列表

Mysql5.7.29主从集群(草稿)

一. Linux 安装&下载 MySQL5.7.29

wget -c https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.29-1.el7.x86_64.rpm-bundle.tar

解压MySQL

tar -xvf mysql-5.7.29-1.el7.x86_64.rpm-bundle.tar

查看CentOS7中是否安装 mariadb

rpm -qa|grep mariadbrpm -qa|grep mariadb*

卸载 mariadb 及相关(有什么就卸载什么)

yum remove mariadbyum remove mariadb-libs

卸载配置文件

rm -f /etc/my.cnf

删除数据目录

rm -rf /var/lib/mysql/


安装 libaio 、perl,net-tools 依赖(安装过程中缺什么装什么)

# 查看libaioperlnet-tools有什么版本yum list | grep libaioperlnet-toolsyum install -y libaio.x86_64



安装MySQL 的rpm包(这里我们只需要安装Server、与Client)

sudo rpm -ivh mysql-community-server-5.7.29-1.el7.x86_64.rpm# 如果报错 + 上 “--nodeps# 原因:这是由于yum安装了旧版本的GPG keys造成的 解决办法:后面加上 --force --nodeps sudo rpm -ivh mysql-community-server-5.7.29-1.el7.x86_64.rpm --nodeps
rpm -ivh mysql-community-client-5.7.29-1.el7.x86_64.rpm --nodeps


创建mysql的数据与日志存储位置(一般存储到data数据盘)

# 数据库数据存储目录mkdir -p /data/mysql# 数据库日志存储目录mkdir -p /data/mysql/log


创建mysql用户组

groupadd mysql

创建mysql用户

 useradd -r -s /sbin/nologin -g mysql mysql -d /usr/bin/mysql

创建数据盘里的mysql包及其它相关路径

mkdir -p /data/mysql/datamkdir -p /data/mysql/logmkdir -p /data/mysql/binlogmkdir -p /data/mysql/share
# 变更权限chown -R mysql:mysql /data/mysql/datachown -R mysql:mysql /data/mysql/logchown -R mysql:mysql /data/mysql/binlogchown -R mysql:mysql /data/mysql/share


编辑MySQL常规配置(根据上面路径配置)


vim /etc/my.cnf

# For advice on how to change settings please see# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html
[mysql]# 默认的数据库字符集default-character-set=utf8mb4
# 错误日志文件messages = en_USlc-messages-dir = /data/mysql/share## Remove leading # and set to the amount of RAM for the most important data# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.# innodb_buffer_pool_size = 128M## Remove leading # to turn on a very important data integrity option: logging# changes to the binary log between backups.# log_bin## Remove leading # to set options mainly useful for reporting servers.# The server defaults are faster for transactions and fast SELECTs.# Adjust sizes as needed, experiment to find the optimal values.# join_buffer_size = 128M# sort_buffer_size = 2M# read_rnd_buffer_size = 2M
# 事物引擎default-storage-engine=INNODB
# 默认字符集character_set_server=utf8mb4
# 时间戳配置(解决初始化错误问题)explicit_defaults_for_timestamp=true
# 错误日志文件lc-messages = en_USlc-messages-dir = /data/mysql/share
# 单独设置binlog 日志路径,最好与数据目录分开,设置到不同磁盘分区,这样提高IO效率log-bin = /data/mysql/binlog/mysql-bin.log
# 服务器唯一标识,启动binlog日志就必须设置唯一id ,否则无法启动 server-id=1 log_bin_index=/data/mysql/binlog/mysql-bin.index
# 主从同步采用此种格式的binlog binlog-format=MIXED
# binlog 优化配置binlog_cache_size = 1Mmax_binlog_cache_size = 128Mmax_binlog_size = 1G
# 连接池优化max_connections = 512# 表文件描述符的缓存大小优化table_open_cache = 2048
# 链接池首次分配内存大小sort_buffer_size = 1M# 语句内关联分配内存大小join_buffer_size = 2M
# 查询结果传输最大值优化max_allowed_packet = 128M

datadir=/data/mysql/databasedir=/usr/sbin
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security riskssymbolic-links=0
log-error=/data/mysql/log/mysqld.logpid-file=/var/run/mysqld/mysqld.pid

[mysqld_safe]# 增加错误日志,当数据库无法启动等问题时会产生错误日志,通过日志来排查问题log-error = /data/mysql/log/error.log



初始化MySQL数据库【一定要记住初始化密码,可以在log的最上行找到初始密码

mysqld --initialize --defaults-file=/etc/my.cnf --user=mysql --basedir=/usr/sbin --datadir=/data/mysql/data

MySQL数据库加密

mysql_ssl_rsa_setup --datadir=/data/mysql/data


MySQL 主从同步配置(Master)

vim /etc/my.cnf
# id 设置为内网地址最后一段server-id=28log_bin=master-binlog_bin_index=master-bin.indexbinlog_do_db=testbinlog_do_db = mysql#备注:#server-id 服务器唯一标识。#log_bin 启动MySQL二进制日志,即数据同步语句,从数据库会一条一条的执行这些语句。#binlog_do_db 指定记录二进制日志的数据库,即需要复制的数据库名,如果复制多个数据库,重复设置这个选项即可。#binlog_ignore_db 指定不记录二进制日志的数据库,即不需要复制的数据库名,如果有多个数据库,重复设置这个选项即可。#其中需要注意的是,binlog_do_db和binlog_ignore_db为互斥选项,一般只需要一个即可




启动MySQL Server

# 查看启动命令Listsystemctl list-unit-files --type=service | grep mysql# 运行命令systemctl start mysqld.service

如果发现报错

Job for mysqld.service failed because the control process exited with error code. See "systemctl status mysqld.service" and "journalctl -xe" for details.
# 查看 log 日志,对应处理cat /data/mysql/log/mysqld.log


通过初始密码登录改一个新密码

mysqladmin -uroot -p密码 password 新密码


如果密码忘记了

# 配置文件中添加:skip-grant-tables# 重启mysqlsystemctl restart mysqld.service# 不需要密码可以直接登陆mysql -uroot -p


在Master上创建从服务器权限

# IP地址,写 backup节点的IP地址。重点是前面的 replication slavegrant replication slave on *.* to masterbackup@'192.168.x.%' identified by '123456';
#备注#192.168.17.%通配符,表示0-255的IP都可访问主服务器,正式环境请配置指定从服务器IP#若将 192.168.17.% 改为 %,则任何ip均可作为其从数据库来访问主服务器
退出mysqlmysql> exit;service mysql restartmysql -uroot -p show master status;              #记录pos 位置,和日志文件名字


二. 将MySQL包Copy 到其它节点

1. 重复上面Master步骤

截止到常规配置(过程略....)

2. 将常规配置中, Master 的部分更替为 如下(slave):

# 从机 01vim /etc/my.cnf
# id 设置为内网地址最后一段server-id=1# slave只读限制read-only =1
binlog_do_db = testbinlog_do_db = mysqlrelay-log=slave-relay-birelay-log-index=slave-relay-bin.index
# 从机 27vim /etc/my.cnf
# id 设置为内网地址最后一段server-id=27# slave只读限制read-only =1
binlog_do_db = testbinlog_do_db = mysqlrelay-log=slave-relay-birelay-log-index=slave-relay-bin.index


3. 从节点数据库初始化

4. 从节点数据库加密

5. 启动mysql服务

systemctl start mysqld.service

5. 启动同步

# 链接 slave 01、27[密码去初始化的日志里找]mysql -uroot -p# 初始化密码SET PASSWORD = PASSWORD('新密码');
# 停止从机同步stop slave;# 注意 :master_host,master_port,master_user# 注意2: master_log_file 跟 master_log_pos 跟 master 上的截图一致;【主机上 show master status;】change master to master_host='192.168.1.1',master_port=88306,master_user='masterbackup',master_password='123456',master_log_file='master-bin.000004',master_log_pos=154;
# 启动从机同步start slave
show slave status\G;        #查看状态是否正常
# 备注:# master_log_file,master_log_pos 为在主上执行show master status命令查看获得信息# show slave status;\G     查看状态如下全为yes 即可,否则配置有问题# Slave_SQL_Running: Yes# Slave_IO_Running: Yes


Master 创建用户(详细可见最下方【权限控制】)

# 普通用户所有权限grant all privileges  on *.*  to "用户"@'网段%' identified by '密码';# 收回super权限revoke super on *。* from '用户'@"%";

slave 创建数据同步用户(与master一致)

# root 用户登陆mysql -uroot -p# 配置数据同步用户grant replication slave on *.* to masterbackup@'192.168.x.%' identified by '123456';


测试

登录mysql 主
选择test 数据库,创建如下表
# 创建测试库create database test;# 使用test库use test;# 创建测试表create table slave_test(id int(6),name varchar(10));# 插入测试数据insert into slave_test values(000001,'weiyang');# 刷新FLUSH PRIVILEGES;# 查看show tables;select * from slave_test;



maxscale 安装(实现读写分离)

安装 maxscale 

# 下载 maxscalewget https://downloads.mariadb.com/MaxScale/1.4.5-debug/centos/7server/x86_64/maxscale-1.4.5-1.centos.7.x86_64.rpm# 安装rpm -ivh maxscale-1.4.5-1.centos.7.x86_64.rpm


3.主服务器上创建账号
#监控账号

create user scalemon@’192.168.0.%’ identified by123456’;grant replication slave, replication client on *.* to scalemon@’192.168.0.%’;

#路由账号

create user maxscale@’192.168.0.%’ identified by123456’;grant select on mysql.* to maxscale@’192.168.0.%’ ;


配置MaxScale/etc/maxscale.cnf

vim /etc/maxscale.cnf

# MaxScale documentation on GitHub:# https://github.com/mariadb-corporation/MaxScale/blob/master/Documentation/Documentation-Contents.md
# Global parameters## Complete list of configuration options:# https://github.com/mariadb-corporation/MaxScale/blob/master/Documentation/Getting-Started/Configuration-Guide.md
[maxscale]threads=1
# Server definitions## Set the address of the server to the network# address of a MySQL server.#
[server1]type=serveraddress=192.168.0.xxport=3306protocol=MySQLBackend

[server2]type=serveraddress=192.168.0.xxport=3306protocol=MySQLBackend

[server3]type=serveraddress=192.168.0.xxport=3306protocol=MySQLBackend

# Monitor for the servers## This will keep MaxScale aware of the state of the servers.# MySQL Monitor documentation:# https://github.com/mariadb-corporation/MaxScale/blob/master/Documentation/Monitors/MySQL-Monitor.md
[MySQL-Monitor]type=monitormodule=mysqlmonservers=server1,server2,server3user=监控passwd=监控密码monitor_interval=10000detect_stale_master=true# Service definitions## Service Definition for a read-only service and# a read/write splitting service.#
# ReadConnRoute documentation:# https://github.com/mariadb-corporation/MaxScale/blob/master/Documentation/Routers/ReadConnRoute.md
# [Read-Only Service]# type=service# router=readconnroute# servers=server1# user=myuser# passwd=mypwd# router_options=slave
# ReadWriteSplit documentation:# https://github.com/mariadb-corporation/MaxScale/blob/master/Documentation/Routers/ReadWriteSplit.md
[Read-Write-Service]# type=service type=servicerouter=readwritesplitservers=server1,server2,server3user=路由 passwd=路由密码max_slave_connections=100%max_slave_replication_lag=60use_sql_variables_in=all
# This service enables the use of the MaxAdmin interface# MaxScale administration guide:# https://github.com/mariadb-corporation/MaxScale/blob/master/Documentation/Reference/MaxAdmin.md
[MaxAdmin-Service]type=servicerouter=cli
# Listener definitions for the services## These listeners represent the ports the# services will listen on.#
# [Read-Only Listener]# type=listener# service=Read-Only Service# protocol=MySQLClient# port=4008
[Read-Write-Listener]type=listenerservice=Read-Write-Serviceprotocol=MySQLClientport=7306
[MaxAdmin-Listener]type=listenerservice=MaxAdmin-Serviceprotocol=maxscaledport=7305socket=default


启动MaxScale服务

maxscale --config=/etc/maxscale.cnf


进入MaxScale的管理窗口

#默认用户名密码 admin;mariadbmaxadmin --user=admin --password=mariadb -P端口号


登录 MaxScale 管理器,查看一下数据库连接状态

MaxScale> list servers

可以看到,MaxScale 已经连接到了 master 和 slave


测试

先在 master 上创建一个测试用户

使用 Mysql 客户端到连接 MaxScale

Select @@hostname;start transaction;Select @@hostname;roolback;Select @@hostname;

开启事务后,就自动路由到了 master,普通的查询操作,是在 slave上。



总结

通过MaxScale可以很轻松的实现MySQL数据库的读写分离和负载均衡。




三. 权限管理

我们知道我们的最高权限管理者是root用户,它拥有着最高的权限操作。包括select、update、delete、update、grant等操作。那么一般情况在公司之后DBA工程师会创建一个用户和密码,让你去连接数据库的操作,并给当前的用户设置某个操作的权限(或者所有权限)。那么这时就需要我们来简单了解一下:

  • 如何创建用户和密码

  • 给当前的用户授权

  • 移除当前用户的权限

如果你想创建一个新的用户,则需要以下操作:

  1. 进入到mysql数据库下

        
          
          
        

    mysql> use mysql
    Database changed

  2. 对新用户增删改

        
          
          
        
  3. 对当前的用户授权管理

        
          
          
        
  4. MySql备份命令行操作

        
          
          
        

    # 备份:数据表结构+数据
    mysqdump -u root db1 > db1.sql -p


    # 备份:数据表结构
    mysqdump -u root -d db1 > db1.sql -p

    #导入现有的数据到某个数据库
    #1.先创建一个新的数据库
    create database db10;
    # 2.将已有的数据库文件导入到db10数据库中
    mysqdump -u root -d db10 < db1.sql -p