Mysql数据库扩展
安装跟卸载
Mysql安装
下载Mysql源安装包
1 wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm
yum安装mysql源
2 yum localinstall mysql57-community-release-el7-8.noarch.rpm -y
检查mysql源是否安装成功
3 yum repolist enabled | grep "mysql.*-community.*"
yum安装Mysql
4 yum install mysql-community-server -y
启动Mysql服务
5 systemctl start mysqld
并添加开机启动
systemctl enable mysqld systemctl daemon-reload
查看Mysql状态
6 systemctl status mysqld
查看默认的mysql密码
此时Mysql安装完成!!!
接下来修改密码
查看默认的mysql密码
7 vi /var/log/mysqld.log
修改mysql的密码
登录mysql: mysql -uroot -p 回车
密码: =>g6hj.Nx4e (上面查看的原始密码)
8 set password for 'root'@'localhost'=password(soy@3975');
9 添加远程登陆的用户权限
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'Jamie@3975' WITH GRANT OPTION;
FLUSH PRIVILEGES;
10 修改mysql字符编码
vi /etc/my.cnf
添加
character_set_server=utf8
init_connect='SET NAMES utf8'
11 重启Mysql
systemctl stop mysqld
systemctl start mysqld
12 查看Mysql字符集
show variables like '%character%'
Mysql卸载
rpm -qa|grep -i mysql
yum remove mysql-community-server -y
rpm -ev mysql-community-libs-5.7.24-1.el7.x86_64 --nodeps
删除文件
find / -name mysql
rm -rf /var/lib/mysql
rm -rf /etc/my.cnf
Mysql docker安装
docker run --name mysql3307 -p 3307:3306 --privileged=true -ti -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=enjoy -e MYSQL_USER=user -e MYSQL_PASSWORD=pass -v /home/mysql/docker-data/3307/conf:/etc/mysql/conf.d -v /home/mysql/docker-data/3307/data/:/var/lib/mysql -v /home/mysql/docker-data/3307/logs/:/var/log/mysql -d mysql:5.7
为什么要做数据库扩展
数据库扩展解决了什么问题?
热备份,多活,故障切换
负载均衡、读写分离
Replication常用架构
常规复制架构(Master --- Slaves)
在实际应用场景中,MySQL 复制 90% 以上都是一个 Master 复制到一个或者多个Slave 的架构模式
缺点:
1、master不能停机,停机就不能接收写请求
2、slave过多会出现延迟
由于master需要进行常规维护停机了,那么必须要把一个slave提成master,选哪一个是一个问题?
某一个slave提成master了,就存在当前master和之前的master数据不一致的情况,并且之前master并没有保存当前
master节点的binlog文件和pos位置。
Dual Master 复制架构(Master --- Master) Master)
可以配合一个第三方的工具,比如keepalived轻松做到IP的漂移,停机维护也不会影响写操作。
级联复制架构(Master --- Slaves --- Slaves ...) ...)
如果读压力加大,就需要更多的slave来解决,但是如果slave的复制全部从master复制,势必会加大master的复制IO的压力,所以就出现了级联复制,减轻master压力。
缺点:
slave延迟更加大了
Dual Master 与级联复制结合架构(Master - Master - Slaves)
这样解决了单点master的问题,解决了slave级联延迟的问题.
Replication机制的实现原理
mysql数据热备份
1、进入mysql查看数据库
mysql -uroot -p123456;
show databases;
2、备份相应数据库
mysqldump -uroot -p123456 --databases consult mall > back.sql
这里需要注意,如果是热备份,这里需要在dump数据之前进行锁表操作,避免dump数据的时候出现插入操作导致数据不一致的情况。
3、master锁表
锁表:flush table with read lock;
4、slave导入数据
mysql -uroot -p123456 < back.sql
5、master解锁
解锁:unlock tables;
Mysql主从复制
master配置
server-id=135
#开启复制功能
log-bin=mysql-bin
auto_increment_increment=2
auto_increment_offset=1
lower_case_table_names=1
#binlog-do-db=mstest //要同步的mstest数据库,要同步多个数据库
#binlog-ignore-db=mysql //要忽略的数据库
slave配置
server-id=133
log-bin=mysql-bin
auto-increment-increment=2
auto-increment-offset=2
lower_case_table_names=1
#replicate-do-db = wang #需要同步的数据库
#binlog-ignore-db = mysql
#binlog-ignore-db = information_schema
1 在master mysql添加权限
GRANT REPLICATION SLAVE,FILE,REPLICATION CLIENT ON *.* TO 'repluser'@'%' IDENTIFIED BY '123456';
FLUSH PRIVILEGES;
2 在master上查看master的二进制日志
show master status;
3 在slave中设置master的信息
change master to master_host='192.168.88.135',master_port=3307,master_user='repluser',master_password='Jack@123456',master_log_file='mysql-bin.000001',master_log_pos=154;
4 开启slave,启动SQL和IO线程
start slave;
5 查看slave的状态
show slave status\G
6 查看二进制日志是否开启
show global variables like "%log%";
7 查看进程信息
SHOW PROCESSLIST;
8 允许root远程连接
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'youpassword' WITH GRANT OPTION;
FLUSH PRIVILEGES;
Mysql主从半同步复制
加载lib,所有主从节点都要配置
主库:install plugin rpl_semi_sync_master soname 'semisync_master.so';
从库:install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
可以一起装。建议一起装,因为会有主从切换的情景。
查看,确保所有节点都成功加载。
show plugins;
启用半同步
先启用从库上的参数,最后启用主库的参数。
从库:set global rpl_semi_sync_slave_enabled = {0|1}; # 1:启用,0:禁止
主库:
set global rpl_semi_sync_master_enabled = {0|1}; # 1:启用,0:禁止
set global rpl_semi_sync_master_timeout = 10000; # 单位为ms
风险:endbled写入配置文件的话,会使实例启动后立即进入半同步模式,如果发生长时间断连的实例重新运行启动,有可能导致主库被拖垮。
建议:长时间断开的从库,重新连接后,要等待追完全部事务后,手动开启半同步模式,而不是启动后直接切换,防止冲击主库。
master的my.cnf配置
[mysqld]
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000
slave的my.cnf配置
[mysqld]
rpl_semi_sync_slave_enabled=1
从库重启io_thread
stop slave io_thread;
start slave io_thread;
查询主库状态信息
show global status like "%sync%";
重要参数
Rpl_semi_sync_master_clients 支持和注册半同步复制的已连Slave数
Rpl_semi_sync_master_no_times master关闭半同步复制的次数
Rpl_semi_sync_master_no_tx master没有收到slave的回复而提交的次数,可以理解为master等待超时的次数,即半同步模式不成功提交数量
Rpl_semi_sync_master_status ON是活动状态(半同步),OFF是非活动状态(异步),用于表示主服务器使用的是异步复制模式,还是半同步复制模式
Rpl_semi_sync_master_tx_avg_wait_time master花在每个事务上的平均等待时间
Rpl_semi_sync_master_tx_waits master等待成功的次数,即master没有等待超时的次数,也就是成功提交的次数
Rpl_semi_sync_master_yes_tx master成功接收到slave的回复的次数,即半同步模式成功提交数量。
查询主库参数信息
show global variables like '%sync%';
重要参数
rpl_semi_sync_master_enabled (主库)是否启动半同步
rpl_semi_sync_master_timeout 等待多时毫秒后变成异步复制,默认是10000ms
rpl_semi_sync_master_wait_point 5.7默认AFTER_SYNC(增强版半同步复制,无损复制模式),在得到slave的应答后再commit,可选值AFTER_COMMIT,在master提交后同步数据给slave,然后master等待slave应答,应答成功返回客户端。
after_commit缺点
缺点1: 幻读
当用户发起一个事务,该事务已经写入redo日志和binlog日志,但该事务还没写入从库,此时处在waiting slave dump处,此时另一个用户可以读取到这条数据,而他自己却不能;
缺点2:数据丢失
一个事务在waiting slave dump处crash后,主库将比从库多一条数据
mysql官网配置信息详解
https://dev.mysql.com/doc/refman/5.6/en/replication-options-reference.html
Mysql高可用
haproxy安装
找到haproxy的包
wget http://pkgs.fedoraproject.org/repo/pkgs/haproxy/haproxy-1.7.9.tar.gz
解压
tar zxf haproxy-1.7.9.tar.gz
编译安装
cd haproxy-1.7.9
make TARGET=linux310 ARCH=x86_64 (查看自己系统是什么 uname -r)
make install SBINDIR=/usr/sbin/ MANDIR=/usr/share/man/ DOCDIR=/usr/share/doc/
配置haproxy
新建目录和用户
mkdir /etc/haproxy
mkdir /var/lib/haproxy
useradd -r haproxy
编辑配置文件
vi /etc/haproxy/haproxy.cfg
配置日志
vim /etc/rsyslog.conf
# Provides TCP syslog reception #去掉下面两行注释,开启TCP监听
$ModLoad imudp
$UDPServerRun 514
local2.* /var/log/haproxy.log #添加日志
vi /etc/sysconfig/rsyslog
SYSLOGD_OPTIONS=""
改为 SYSLOGD_OPTIONS="-r -m 2 -c 2"
创建日志文件
touch /var/log/haproxy.log
启动日志
systemctl restart rsyslog.service
启动haproxy cd /usr/sbin/haproxy
./haproxy -f /etc/haproxy/haproxy.cfg
在两台数据库添加远程访问权限
GRANT ALL ON *.* TO 'root'@'%' IDENTIFIED BY 'Jack@123456';
FLUSH PRIVILEGES;
测试haproxy服务器能否连接到数据库服务器
安装mysql客户端
yum install -y mysql
mysql -uroot -pJack@123456 -h 192.168.88.135
mysql -uroot -pJack@123456 -h 192.168.88.133
在非haproxy服务器测试通过访问haproxy访问到mysql服务
mysql -uroot -pJack@123456 -h 192.168.88.132 -P 3300
访问页面 http://192.168.88.132:1080/stats
keepalived安装
源码安装
wget http://www.keepalived.org/software/keepalived-1.3.5.tar.gz
tar -zxvf keepalived-1.3.5.tar.gz
安装openssl openssl-devel
yum -y install openssl openssl-devel
./configure --prefix=/usr/local/keepalived --sbindir=/usr/sbin/ --sysconfdir=/etc/ -- mandir=/usr/local/share/man/
make && make install
修改配置
vi /etc/keepalived/keepalived.conf
给执行权限
# chmod +x /etc/keepalived/chk.sh
创建检查haproxy脚本
Yum安装
keepalived yum安装
预先安装好epel-release源
yum list installed|grep epel-release
查找可用安装的keepalived源
yum search keepalived
命令进行安装
yum install keepalived -y
启动keepalived服务
systemctl start keepalived
使用yum安装的会有一个默认配置文件模板
路径为/etc/keepalived/keepalived.conf
yum install ipvsadm -y
mysql -h 192.168.67.140 -u root -p123456 -P 3307 -e "show status;" >/dev/null 2>&1
>/dev/null 2>&1 输出”黑洞”
$? 上一个指令是否执行成功
0 成功 1 失败
何为数据切分
简单来说,就是指通过某种特定的条件,将我们存放在同一个数据库中的数据分散存放到多个数据库(主机)上面,以达到分散单台设备负载的效果。
数据切分分为两种:
垂直切分
水平切分
垂直切分:
垂直切分的优点
◆ 数据库的拆分简单明了,拆分规则明确;
◆ 应用程序模块清晰明确,整合容易;
◆ 数据维护方便易行,容易定位;
垂直切分的缺点
◆ 部分表关联无法在数据库级别完成,需要在程序中完成,存在跨库join的问题,对于这类的表,就需要去做平衡,是数据库让步业务,共用一个数据源,还是分成多个库,业务之间通过接口来做调用;在系统初期,数据量比较少,或者资源有限的情况下,会选择共用数据源,但是当数据发展到了一定的规模,负载很大的情况,就需要必须去做分割。
◆ 对于访问极其频繁且数据量超大的表仍然存在性能瓶颈,不一定能满足要求;
◆ 事务处理相对更为复杂;
◆ 切分达到一定程度之后,扩展性会遇到限制;
◆ 过多切分可能会带来系统过渡复杂而难以维护。
水平切分:
相对于垂直拆分,水平拆分不是将表做分类,而是按照某个字段的某种规则来分散到多个库之中,每个表中包含一部分数据。简单来说,我们可以将数据的水平切分理解为是按照数据行的切分,就是将表中的某些行切分到一个数据库,而另外的某些行又切分到其他的数据库中.
水平切分的优点
◆ 表关联基本能够在数据库端全部完成;
◆ 不会存在某些超大型数据量和高负载的表遇到瓶颈的问题;
◆ 应用程序端整体架构改动相对较少;
◆ 事务处理相对简单;
◆ 只要切分规则能够定义好,基本上较难遇到扩展性限制;
水平切分的缺点
切分规则相对更为复杂,很难抽象出一个能够满足整个数据库的切分规则;
后期数据的维护难度有所增加,人为手工定位数据更困难;
应用系统各模块耦合度较高,可能会对后面数据的迁移拆分造成一定的困难。
跨节点合并排序分页问题
多数据源管理问题
几种典型的分片规则
1、按照用户ID求模,将数据分散到不同的数据库,具有相同数据用户的数据都被分散到一个库中。
2、按照日期,将不同月甚至日的数据分散到不同的库中。
3、按照某个特定的字段求摸,或者根据特定范围段分散到不同的库中。
由于数据切分后数据Join的难度在此也分享一下数据切分的经验
第一原则:能不切分尽量不要切分。
第二原则:如果要切分一定要选择合适的切分规则,提前规划好。
第三原则:数据切分尽量通过数据冗余或表分组(Table Group)来降低跨库Join的可能。
第四原则:由于数据库中间件对数据Join实现的优劣难以把握,而且实现高性能难度极大,业务读取尽量少使用多表Join。
综上描述,数据切分带来的核心问题主要有三个:
◆ 引入分布式事务的问题;
◆ 跨节点 Join 的问题;
◆ 跨节点合并排序分页问题;
Mysql数据库扩展的更多相关文章
- (独孤九剑)---PHP操作MySQL数据库
[一]开启mysql扩展 在PHP操作MySQL数据库之前,要保证开启了MySQL数据库扩展 若未开启,则可以将php.int文件下的php_mysql开启即可,方式为去掉前面的封号; 配置完成后要重 ...
- php笔记08:数据库编程---使用php的MySQL扩展库操作MySQL数据库
1.使用php的MySQL扩展库操作MySQL数据库: php有3种方式操作MySQL数据库 (1)mysql扩展库 (2)mysqli扩展库 (3)pdo mysql扩展库与mysql数据库 ...
- mysqli扩展库操作mysql数据库
配置环境 配置php.ini文件让php支持mysqli扩展库 extension=php_mysqli.dll 建库建表 详见博客 “mysql扩展库操作mysql数据库” 查询数据库 <?p ...
- PHP使用mysqli扩展连接MySQL数据库
这篇文章主要介绍了PHP使用mysqli扩展连接MySQL数据库,需要的朋友可以参考下 1.面向对象的使用方式 $db = new mysqli('localhost', 'root', '12345 ...
- 使用php的mysqli扩展库操作mysql数据库
简单介绍mysqli: 1.mysqli(mysql improve mysql扩展库的增强版) mysql扩展库和mysqli扩展库的区别 1.mysqli的稳定性 安全性 和 执行效率有所提高 ...
- PHP mysql 扩展库 操作mysql数据库步骤
一.mysql 扩展库操作mysql数据库步骤如下: 1.获取连接 2.选择数据库 3.设置操作编码 4.发送指令(ddl数据定义/dml数据操作/dql数据查询/dtl数据事务控制) 5.接收返回的 ...
- Flask 操作Mysql数据库 - flask-sqlalchemy扩展
数据库的设置 Web应用中普遍使用的是关系模型的数据库,关系型数据库把所有的数据都存储在表中,表用来给应用的实体建模,表的列数是固定的,行数是可变的.它使用结构化的查询语言.关系型数据库的列定义了表中 ...
- MySQL数据库单例连接简单实现(MySQL扩展)
<?php /** * MySQL数据库单例实现 * * @author shizq at 2015-04-22 * */ final class MySQLFactory { private ...
- php中使用mysqli和pdo扩展,测试连接mysql数据库的效率。
<?php /** * 测试pdo和mysqli的连接效率,各连接100次mysql数据库 */ header("Content-type:text/html;charset=utf8 ...
随机推荐
- ZooKeeper Watcher 机制
前言 在 ZooKeeper 中,客户端可以向服务端注册一个监听器,监听某个节点或者其子节点列表,当监听对象发生变化时,服务端就会向指定的客户端发送通知,这是 ZooKeeper 中的 Watcher ...
- Jenkins持续集成(下)-Jenkins部署Asp.Net网站自动发布
环境:Windows 2008 R2.Jenkins2.235.1.Visual Studio 2017: 概要 前面写过一篇文章,<自动发布-asp.net自动发布.IIS站点自动发布(集成S ...
- Eclipse的Servers中无法添加Tomcat6/7
2017年03月06日 17:14:46 阅读数:1007 Eclipse中在添加tomcat时发现6和7点击后发现ServerName是灰色的不能使用,也点不了NEXT,在各种查百度后发现需要删除w ...
- AS在安装GitHub时出现错误:Empty git --version output:
AS在安装GitHub时出现错误: 原因:在选择git.exe时选择错误. 解决方法: 选择如下Git下cmd或者bin中的git.exe文件:
- UML活动图(二)
转载于https://www.cnblogs.com/xiaolongbao-lzh/p/4591953.html 活动图概述 •活动图和交互图是UML中对系统动态方面建模的两种主要形式 •交互图强调 ...
- 为什么LinkedList不建议使用for循环遍历,而使用iterator方式进行遍历,但ArrayList建议使用for循环进行遍历呢?
如果使用for循环方式遍历链表,由于链表中元素是通过指针连接彼此的,不存在索引的概念,如果使用for循环方式遍历LinkedList,依次传入索引值,则就相当于每次都要将链表撸一遍. 如:在下面的这个 ...
- SpringBoot--- SpringSecurity进行注销,权限控制
SpringBoot--- SpringSecurity进行注销,权限控制 环境 IDEA :2020.1 Maven:3.5.6 SpringBoot: 2.0.9 (与此前整合的版本2.3.3 不 ...
- Magento1.9 add attribute to catalog product & assign to all attribute set general group
$installer = $this; $attributes = array( 'region' => array( 'type' => 'int', 'input' => 'se ...
- 操作系统-PV习题
(1)阅览室问题:加入阅览室入口有一本登记册,每个人都必须按顺序签名进去. 想法:登记册可以用结构数组A[]表示,包含name和number.此外,还需要信号量seatcount表示剩余座位数. 使用 ...
- 2020.5.26 第六篇 Scrum冲刺博客
Team:银河超级无敌舰队 Project:招新通 项目冲刺集合贴:链接 目录 一.每日站立会议 1.1 会议照片 1.2 项目完成情况 二.项目燃尽图 三.签入记录 3.1 代码/文档签入记录 3. ...