首页 > 技术文章 > 数据库高可用galera集群 mongo数据库基本操作增删减改查

kk5698 2020-08-09 19:02 原文

高可用galera集群   mongo数据库基本操作增删减改查

1.MySQL高可用解决方案Galera Cluster 集群

MySQL Galera Cluster介绍

Galera Cluster不同于常规的MySQL Server软件,安装了额外的插件,也需要额外的配置

Galera Cluster要求最少3个节点,即3台MySQL服务器主机

Galera Cluster复制仅仅支持支持事务的InnoDB存储引擎

任何写入其他引擎的表 包括mysql.*表   将不会复制,但是DDL语句会被复制的,因此创建用户将会被复制,但是insert into mysql.user…将不会被复制的

DELETE操作不支持没有主键的表

整个集群的写入吞吐量是由最弱的节点限制,如果有一个节点变得缓慢,那么整个集群将是缓慢的。为了稳定的高性能要求,所有的节点应使用统一的硬件。

Galera Cluster优势和适用场景

多节点写入和读取需求

数据库节点数据一致性要求高的业务

数据高可用性要求高的业务

2.案例: 安装配置Galera Cluster

IP

主机名

角色

操作系统(最小安装)

MySQL

192.168.20.11

host21

主库

Centos 7

Galera Cluster for MySQL 5.7.2x rpm包安装版

192.168.20.12

host22

主库

Centos 7

Galera Cluster for MySQL 5.7.2x rpm包安装版

192.168.20.13

host23

主库

Centos 7

Galera Cluster for MySQL 5.7.2x rpm包安装版

1.安装前准备 关闭selinux 和防火墙  上传安装包

关闭selinux

vim /etc/selinux/config

 

 

 

 

关闭防火墙

systemctl disable firewalld

systemctl stop firewalld

 

每个节点上传Galera Cluster for MySQL rpm包  8个

scp *.rpm 192.168.20.12:~上传到一个机器 然后发送到其他机器上即可

 

galera-3-25.3.24-2.el7.x86_64.rpm

mysql-wsrep-5.7-5.7.23-25.15.el7.x86_64.rpm

mysql-wsrep-common-5.7-5.7.23-25.15.el7.x86_64.rpm

mysql-wsrep-client-5.7-5.7.23-25.15.el7.x86_64.rpm

mysql-wsrep-libs-5.7-5.7.23-25.15.el7.x86_64.rpm

mysql-wsrep-libs-compat-5.7-5.7.23-25.15.el7.x86_64.rpm

mysql-wsrep-server-5.7-5.7.23-25.15.el7.x86_64.rpm

mysql-wsrep-test-5.7-5.7.28-25.20.el7.x86_64.rpm  测试用的  可删除

 

 

 

 

 

2.yum安装  每个节点的rpm软件包

 

rm -rf mysql-wsrep-test-5.7-5.7.28-25.20.el7.x86_64.rpm  这个是测试文件 test 可删除

yum -y install *.rpm安装上传的安装包

 

 

yum install rsync

yum install galera-3-25.3.24-2.el7.x86_64.rpm

yum install mysql-wsrep-5.7-5.7.23-25.15.el7.x86_64.rpm mysql-wsrep-client-5.7-5.7.23-25.15.el7.x86_64.rpm mysql-wsrep-common-5.7-5.7.23-25.15.el7.x86_64.rpm mysql-wsrep-libs-5.7-5.7.23-25.15.el7.x86_64.rpm mysql-wsrep-libs-compat-5.7-5.7.23-25.15.el7.x86_64.rpm mysql-wsrep-server-5.7-5.7.23-25.15.el7.x86_64.rpm

 

 

 

 

先去配置节点 node 在      启动mysqld服务 注意顺序

 

3.配置第一个节点NODE1

vim /etc/my.cnf#添加以下内容

 

[mysqld]

 

user=mysql

binlog_format=ROW#日志格式

bind-address=0.0.0.0#不限制ip,可在然后ip上使用

default_storage_engine=innodb#缺省的存储引擎,可不加

innodb_autoinc_lock_mode=2#必须改 为2 缺省情况下为1

innodb_flush_log_at_trx_commit=0#节点

innodb_buffer_pool_size=122M#innodb 缓存大小

wsrep_provider=/usr/lib64/galera-3/libgalera_smm.so#指的是提供的动态库

wsrep_provider_options="gcache.size=300M; gcache.page_size=300M"#提供的选项 必须的 整数倍关系

wsrep_cluster_name="test-cluster"#集群名称

wsrep_cluster_address="gcomm://192.168.20.11,192.168.20.12,192.168.20.13"#集群 节点 的ip地址(最少三个)

wsrep_sst_method=rsync#传输机制 软件

wsrep_node_name=node1#节点的名字

wsrep_node_address="192.168.20.11"#节点 IP地址

 

 

 

   查看是否存在

 

初始化mysql   获取临时密码   启动服务   更改密码  

 

/usr/bin/mysqld_bootstrap初始化服务

 

cat /var/log/mysqld.log | grep temporary获取临时密码

mysql -uroot -p 登录mysql

alter user root@localhost identified by 'Abc123!!!';修改密码

 

 

 

 

 

 

查看集群状态变量

show status like 'wsrep_cluster_size';查看节点

select user,host,authentication_string from mysql.user;

 

 

 

 

 

查看端口

 

 

 

4.配置第二个节点NODE2

vim /etc/my.cnf#添加以下内容

 

[mysqld]

 

user=mysql

binlog_format=ROW

bind-address=0.0.0.0

default_storage_engine=innodb

innodb_autoinc_lock_mode=2

innodb_flush_log_at_trx_commit=0

innodb_buffer_pool_size=122M

wsrep_provider=/usr/lib64/galera-3/libgalera_smm.so

wsrep_provider_options="gcache.size=300M; gcache.page_size=300M"

wsrep_cluster_name="test-cluster"

wsrep_cluster_address="gcomm://192.168.20.11,192.168.20.12,192.168.20.13"

wsrep_sst_method=rsync

wsrep_node_name=node2

wsrep_node_address="192.168.20.12"

 

初始化mysql

systemctl start mysqld   拷贝第一个节点的东西

 

登录mysql

密码  为节点1密 码    Abc123!!!

mysql -uroot -p

 

 

查看集群状态变量  第一个机器

show status like 'wsrep_cluster_size';查看集群

 

 

 

select user,host,authentication_string from mysql.user;查看mysql 用户

 

 

 

5.配置第三个节点NODE3

vim /etc/my.cnf#添加以下内容

 

[mysqld]

 

user=mysql

binlog_format=ROW

bind-address=0.0.0.0

default_storage_engine=innodb

innodb_autoinc_lock_mode=2

innodb_flush_log_at_trx_commit=0

innodb_buffer_pool_size=122M

wsrep_provider=/usr/lib64/galera-3/libgalera_smm.so

wsrep_provider_options="gcache.size=300M; gcache.page_size=300M"

wsrep_cluster_name="test-cluster"

wsrep_cluster_address="gcomm://192.168.20.11,192.168.20.12,192.168.20.13"

wsrep_sst_method=rsync

wsrep_node_name=node3

wsrep_node_address="192.168.20.13"

 

初始化mysql

systemctl start mysqld

 

测试登录mysql

密码为节点1密码Abc123!

mysql -uroot -p

 

查看集群状态变量

show status like 'wsrep_cluster_size';

 

 

 

select user,host,authentication_string from mysql.user;

 

6.测试  多主复制  数据库

任意节点操作:  

mysql> source /root/world.sql上传world.sql到/root

 

 

其他节点查看:

mysql> show databases;

mysql> use world;

mysql> show tables;

mysql> select * from country;

 

7.开启和  关闭集群  先开启节点  再启动服务

systemctl stop mysqld每个节点

 

 

开启集群

第一个节点(11或12或13):  

/usr/bin/mysqld_bootstrap必须用这个命令启动第一个节点

 

其余节点:

systemctl start mysqld

 

8.假如  启动报错处理 方法

先关闭实例

systemctl stop mysqld关闭服务

rm /var/lib/mysql/grastate.dat删除故障节点/var/lib/mysql/grastate.dat删除这个文件  

 

 

 

注意:如果启动第一个节点使用 /usr/bin/mysqld_bootstrap (官方文档说明:针对Centos7 和 galera mysql5.7)

3.MongoDB  的简介  和使用场景 优点与弊端

1.MongoDB简介

MongoDB是由10gen公司(现已改名为MongoDB Inc.)用C++语言研发的一款数据库,2009年开源

MongoDB按照类似于JSON的格式存储数据,称作BSON (binary json),由成对的field和value构成,value除了数值和字符之外也可以包括数组([ ]),其他文档等

 

 

 

每一条数据称作一个文档(document)

相对传统关系型数据库,文档之间可以有不一样的格式(字段field),因此更加灵活

可以为数据创建索引,使用特定查询方式来分析统计数据

MongoDB开源免费,遵从GNU GPL协定

 

2.MongoDB使用的业务场景

适用于: 没有结构化的数据

1.存储表结构不确定经常变换的业务数据

2.数据量很大,但价值较低的数据

3.数据实时性要求高的数据MongoDB批量插入性能非常高(并发量)

 

不适用于:

对事务要求高的业务;和传统关系型数据库比较,MongoDB对事务的支持较差

需要使用SQL的业务场景

 

4.CentOS7安装MongoDB社区版rpm包  联网下载或者上传安装包

1.关闭selinux关闭防火墙   上传安装包  或者 配置yum下载

vim /etc/selinux/config关闭selinux

 

 

 

或者配置yum源 下载安装mongodb

vi /etc/yum.repos.d/mongodb-org-4.0.repo#添加以下内容 联网下载

 

 

 

[mongodb-org-4.0]

name=MongoDB Repository

baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.0/x86_64/

gpgcheck=1

enabled=1

gpgkey=https://www.mongodb.org/static/pgp/server-4.0.asc

 

2.安装MongoDB软件包  配置文件路径 日志 数据 参数文件

yum install -y mongodb-org

 

初始化配置(rpm包安装)

/etc/mongod.conf参数文件位置

 

/var/lib/mongo数据文件位置

 

/var/log/mongodb/mongod.log默认日志文件位置

 

3.允许远程连接

vim /etc/mongod.conf

 

 

 

默认为本机登录 可以修改为0.0.0.0  或者指定网段

 

systemctl restart mongod重启服务

 

 

systemctl stop mongod关闭mongodb服务

systemctl start mongod启动数据库

 

 

4.使用MongoShell连接MongoDB  

mongo --host 127.0.0.1:27017本地连接   27017为端口号

mongo

 

 

 

 

退出MongoDB客户端:

>quit()

 

>exit;

 

 

 

 

 

5.MongoDB术语  与 传统数据库  对照

 

传统RDBMS (MySQL)

MongoDB术语

说明

DATABASE

DATABASE

数据库

TABLE

COLLECTION

表/集合

ROW

DOCUMENT

行/文档

COLUMN

FIELD

列(字段)/ 字段(域)

INDEX

INDEX

索引

TABLE JOIN

 

连接运算;MongoDB不支持集合间连接运算

PRIMARY KEY

PRIMARY KEY

主键,MongoDB默认使用_id field作为主键,如果文档中没有指定_id会自动创建

MongoDB中一个数据库包含多个集合类似于关系型数据中的表

MongoDB中一个集合包含多个文档,文档以BSON格式存储数据

6.MongoDB数据库  与集合  管理命令 创建删除 查看

1.查看所有数据库: show dbs

Mongo

> show dbs;

 

 

 

 

2.创建新数据库newdb:隐形创建数据库格式

>use newdb; newdb不存在

>db;         查看当前所在数据库

>db.myCollection.insertOne( { x: 1 } ); 创建新数据库,其下创建一个叫做myCollection的集合即可 

> show dbs;

> use newdb;

> show collections;

 

 

 

 

 

 

 

 

 

 

3.创建新数据库newdb1:隐形创建数据库

> use newdb1;

> db;显示当前数据库

> db.x.insertOne({name:"zhangsan"});数据库newdb1   集合为x    创建张三的文档

> show collections;

> db.x.find();查看x集合 的文档 的字段

 

 

 

 

4.创建数据库总结:

切换到  一个不存在的数据库

往数据库中  存入数据,产生一个集合  包含一个文档

数据库创建成功

 

例如:

use test

db.c1.insertOne( { x: 1 } )

 

 

 

show tables;查看集合(表)

db.c1.find()查看表c1的内容

 

insertOne() 语句创建test数据库  和c1集合(表)

 

5.使用数据库: 查看当前数据库 删除集合(表) 和数据库

>use test;查看当前使用数据库

> db;

>show collections;查看当前数据库有哪些集合

>show tables;

 

 

 

1.隐式创建集合:如果第一次向一个不存在的集合中存储数据,就会创建一个集合

> use test;

> db;

> db.c2.insertOne({x:1});

> show collections;

 

 

 

 

2.明确创建集合(表)

> db.createCollection("people");创建集合

> show tables;查看集合

 

 

 

3.删除集合(表):

> db.c2.drop();删除c2表

> show collections;

 

 

 

 

4.删除数据库newdb1:  进去数据库  在删除数据库

> show dbs;

> use newdb1;

> db;

> db.dropDatabase();
> show dbs;

 

 

 

7.MongoDB增删改查  操作  相关命令

1.test数据库的   users集合中    插入一个文档:

insertOne  插入一行文档

 

 

 

 

> use test;

> db.users.insertOne(

{

name:"sue",数值类型不用加双引号

age:26,

status:"pending"

}

)

> db.users.insertOne(

{

name:"jack",

age:25,

status:"pending"

}

)

db.users.find();查看users集合(表)的内容

 

 

 

 

2.查看  users集合(表)中的  内容:相当于 select * from users;

> db.users.find();

 

 

 

 

3.查看 users集合(表)中的 指定field字段内容   只显示field name和age

> db.users.find({},{name:1,age:1});前面有空的大括号所有文档符合条件   后面的值为非0   0表示不显示

 

 

 

 

4.查询users集合中的所有文档指定过滤条件age大于等于26:

> db.users.find({age:{$gte:26}})gte大于等于

 

 

 

 

5.查询users集合中的所有文档指定过滤条件age大于等于26,仅显示name和age: limit指定显示几行

> db.users.find({age:{$gte:26}},{name:1,age:1})

 

 

 

 

 

 

 

Find 前面是条件 后面是查找的字段   limit表示显示文档数量

6.test数据库的users集合中插入多个文档:

db.users.insertMany([

{

name:"tom",

age:25,

status:"accepted"

},

{

name:"mary",

age:18,

status:"rejected"

},

{

name:"adam",

age:17,

status:"rejected"

}

])

 

 

 

 

> db.users.find();

 

 

 

 

 

db.users.find({age:{$gt:17}});

db.users.find({age:{$gt:17}}).limit(2);

 

 

 

 

 

7.test数据库users集合更新文档内容:

 

修改 姓名为adam的年龄为27岁:limit修改文档中的几个

> db.users.updateOne({name:"adam"},{$set:{age:27}})

> db.users.find({name:"adam"})

 

 

 

 

 

 

 

db.users.updateOne({status:"rejected"},{$set:{age:22}}) 修改statusrejected 年龄改为22

 

 

 

 

db.users.updateMany({status:"rejected"},{$set:{age:20}})status为rejected的 所有年龄改为10

db.users.find()

 

 

 

 

 

 

 

修改所有人的status为“rejected”

> db.users.updateMany({},{$set:{status:"rejected"}})

> db.users.find()

 

 

 

 

 

 

修改年龄大于20岁的人的status为“accepted”

> db.users.updateMany({"age":{$gte:20}},{$set:{status:"accepted"}})

> db.users.find()

 

 

 

 

8.test数据库users集合删除指定文档:

删除年龄小于20岁的人

> db.users.deleteMany({age:{$lt:20}})

> db.users.find()

 

 

 

 

db.users.deleteMany({name:"tom"})

db.users.find()

 

 

 

 

删除users集合中的所有文档

> db.users.deleteMany({})

 

 

 

8.常用比较运算符

 运算符

说明

$eq

等于指定值

$gt

大于指定值

$gte

大于等于指定值

$in

in 指定的数组的值列表中

$lt

小于指定的值

$lte

小于指定的值

$ne

不等于指定的值

$nin

not in 指定的数组的值列表中

 

举例  增加案例users表

>db.users.insertMany( [ { name:"sue", age:20, status:"pending" }, { name:"jack", age:25, status:"accepted" }, { name:"tom", age:30, status:"accepted" }, { name:"mary", age:18, status:"rejected" }, { name:"adam", age:17, status:"rejected" }, { name:"use", age:20, status:"pending" }, { name:"jack", age:25, status:"accepted" } ])

 

 

 

 

 

年龄等于20岁,显示姓名和年龄:

> db.users.find({age:{$eq:20}},{name:1,age:1});

 

 

 

 

年龄小于等于25岁,显示姓名和年龄:

> db.users.find({age:{$lte:25}},{name:1,age:1});

 

 

 

 

状态为”pending”或”accepted”:

> db.users.find({status:{$in:["accepted","pending"]}})

 

状态不为”rejected”:

> db.users.find({status:{$nin:["rejected"]}})

 

 

 

 

 

9.常用逻辑运算符

 运算符

说明

$and

与运算符; { $and: [ { <expression1> }, { <expression2> } , ... , { <expressionN> } ] }

$not

非运算符;{ field: { $not: { <operator-expression> } } }

$or

或运算符;{ $or: [ { <expression1> }, { <expression2> }, ... , { <expressionN> } ] }

 

举例

年龄在20和30岁之间的文档:

> db.users.find({$and:[{age:{$gte:20}},{age:{$lte:30}}]})

 

 

 

 

状态为“rejected”或者年龄小于等于20岁的文档:

> db.users.find({$or:[{status:"rejected"},{age:{$lte:20}}]})

 

 

 

 

状态不是“rejected”的文档:

> db.users.find({status:{$not:{$eq:"rejected"}}})

 

 

 

 

10.MongoDB变更文档结构

传统关系型数据库使用DDL语句变更表结构,MongoDB使用update(updateOne()或updateMany())方法变更文档结构

 

1.为“use”添加gender(性别) field,值为“female”

> db.users.find();

 

 

 

db.users.updateOne({name:"use"},{$set:{gender:"female"}})

 

 

 

 

 

 

2.查找不包括“gender”field的文档:

> db.users.find({gender:{$exists:false}})

 

 

 

 

3.给不包含“gender”的文档添加字段,默认值为“”

> db.users.updateMany({gender:{$exists:false}},{$set:{gender:""}})

> db.users.find();

> db.users.find({gender:{$eq:""}});

 

 

 

4.设置jack和tom的gender为“male”

> db.users.updateMany({name:{$in:["jack","tom"]}},{$set:{gender:"male"}})

> db.users.find({name:{$in:["jack","tom"]}})

 

 

 

 

5.去掉gender为空字符串的文档的gender列

> db.users.updateMany({gender:{$eq:""}},{$unset:{gender:""}})

> db.users.find();

 

 

 

 

 

 

6.分组统计

 

 

 

navicat导入stu.json到test集合

 

 

 

 

 

 

 

 

下一步下一步   然后开始导入    关闭即可

 

 

 

 

 

查看表

 

 

 

 

 

 

 

 

 db.stu.find({},{_id:0})去掉id字段查看

 

 

 

 

#不分组,统计最高分

db.stu.aggregate([{$match:{}},{$group:{ _id:"",maxscore:{$max:"$score"}}}])

或者改为最高分  更清楚

db.stu.aggregate([{$match:{}},{$group:{ _id:"",最高分:{$max:"$score"}}}])

 

 

 

或者

db.stu.aggregate([{$match:{}},{$group:{ _id:"",maxscore:{$max:"$score"}}},{$project:{maxscore:1,_id:0}}])progect显示需要的结果

 

 

 

 

 

#按照cno分组,统计最高分  去掉空值

db.stu.aggregate([{$match:{}},{$group:{ _id:"$cno",maxscore:{$max:"$score"}}}])

 

 

 

 

#去掉cno=""的,再按照cno分组,统计最高分

db.stu.aggregate([{$match:{cno:{$ne:""}}},{$group:{ _id:"$cno",maxscore:{$max:"$score"}}}])

 

 

 

 

#统计1班,男女生人数

db.stu.aggregate([{$match:{cno:"1"}},{$group:{_id:"$sex",cnt:{$sum:1}}}]);

 

 

 

 

#统计每个班人数

db.stu.aggregate([{$match:{cno:{$ne:0}}},{$group:{_id:"$cno",zcnt:{$sum:1}}}])

 

 

 

 

#统计每个班人数,按照分组列排序

db.stu.aggregate([{$match:{cno:{$ne:0}}},{$group:{_id:"$cno",cnt:{$sum:1}}},{$sort:{_id:1}}])

 

 

 

 

 

#统计人数超过5人的班

db.stu.aggregate([{$match:{cno:{$ne:0}}},{$group:{_id:"$cno",cnt:{$sum:1}}},{$match:{cnt:{$gt:5}}}])

 

 

 

7.去重

db.stu.distinct("cno")

db.stu.distinct("sex")

 

 

 

 

 

 

 

高可用galera集群   mongo数据库基本操作增删减改查

1.MySQL高可用解决方案Galera Cluster 集群

MySQL Galera Cluster介绍

Galera Cluster不同于常规的MySQL Server软件,安装了额外的插件,也需要额外的配置

Galera Cluster要求最少3个节点,即3台MySQL服务器主机

Galera Cluster复制仅仅支持支持事务的InnoDB存储引擎

任何写入其他引擎的表 包括mysql.*表   将不会复制,但是DDL语句会被复制的,因此创建用户将会被复制,但是insert into mysql.user…将不会被复制的

DELETE操作不支持没有主键的表

整个集群的写入吞吐量是由最弱的节点限制,如果有一个节点变得缓慢,那么整个集群将是缓慢的。为了稳定的高性能要求,所有的节点应使用统一的硬件。

Galera Cluster优势和适用场景

多节点写入和读取需求

数据库节点数据一致性要求高的业务

数据高可用性要求高的业务

2.案例: 安装配置Galera Cluster

IP

主机名

角色

操作系统(最小安装)

MySQL

192.168.20.11

host21

主库

Centos 7

Galera Cluster for MySQL 5.7.2x rpm包安装版

192.168.20.12

host22

主库

Centos 7

Galera Cluster for MySQL 5.7.2x rpm包安装版

192.168.20.13

host23

主库

Centos 7

Galera Cluster for MySQL 5.7.2x rpm包安装版

1.安装前准备 关闭selinux 和防火墙  上传安装包

关闭selinux

vim /etc/selinux/config

 

 

关闭防火墙

systemctl disable firewalld

systemctl stop firewalld

 

每个节点上传Galera Cluster for MySQL rpm包  8个

scp *.rpm 192.168.20.12:~上传到一个机器 然后发送到其他机器上即可

 

galera-3-25.3.24-2.el7.x86_64.rpm

mysql-wsrep-5.7-5.7.23-25.15.el7.x86_64.rpm

mysql-wsrep-common-5.7-5.7.23-25.15.el7.x86_64.rpm

mysql-wsrep-client-5.7-5.7.23-25.15.el7.x86_64.rpm

mysql-wsrep-libs-5.7-5.7.23-25.15.el7.x86_64.rpm

mysql-wsrep-libs-compat-5.7-5.7.23-25.15.el7.x86_64.rpm

mysql-wsrep-server-5.7-5.7.23-25.15.el7.x86_64.rpm

mysql-wsrep-test-5.7-5.7.28-25.20.el7.x86_64.rpm  测试用的  可删除

 

 

 

2.yum安装  每个节点的rpm软件包

 

rm -rf mysql-wsrep-test-5.7-5.7.28-25.20.el7.x86_64.rpm  这个是测试文件 test 可删除

yum -y install *.rpm安装上传的安装包

 

 

yum install rsync

yum install galera-3-25.3.24-2.el7.x86_64.rpm

yum install mysql-wsrep-5.7-5.7.23-25.15.el7.x86_64.rpm mysql-wsrep-client-5.7-5.7.23-25.15.el7.x86_64.rpm mysql-wsrep-common-5.7-5.7.23-25.15.el7.x86_64.rpm mysql-wsrep-libs-5.7-5.7.23-25.15.el7.x86_64.rpm mysql-wsrep-libs-compat-5.7-5.7.23-25.15.el7.x86_64.rpm mysql-wsrep-server-5.7-5.7.23-25.15.el7.x86_64.rpm

 

 

先去配置节点 node 在      启动mysqld服务 注意顺序

 

3.配置第一个节点NODE1

vim /etc/my.cnf#添加以下内容

 

[mysqld]

 

user=mysql

binlog_format=ROW#日志格式

bind-address=0.0.0.0#不限制ip,可在然后ip上使用

default_storage_engine=innodb#缺省的存储引擎,可不加

innodb_autoinc_lock_mode=2#必须改 为2 缺省情况下为1

innodb_flush_log_at_trx_commit=0#节点

innodb_buffer_pool_size=122M#innodb 缓存大小

wsrep_provider=/usr/lib64/galera-3/libgalera_smm.so#指的是提供的动态库

wsrep_provider_options="gcache.size=300M; gcache.page_size=300M"#提供的选项 必须的 整数倍关系

wsrep_cluster_name="test-cluster"#集群名称

wsrep_cluster_address="gcomm://192.168.20.11,192.168.20.12,192.168.20.13"#集群 节点 的ip地址(最少三个)

wsrep_sst_method=rsync#传输机制 软件

wsrep_node_name=node1#节点的名字

wsrep_node_address="192.168.20.11"#节点 IP地址

 

 

   查看是否存在

 

初始化mysql   获取临时密码   启动服务   更改密码  

 

/usr/bin/mysqld_bootstrap初始化服务

 

cat /var/log/mysqld.log | grep temporary获取临时密码

mysql -uroot -p 登录mysql

alter user root@localhost identified by 'Abc123!!!';修改密码

 

 

 

 

查看集群状态变量

show status like 'wsrep_cluster_size';查看节点

select user,host,authentication_string from mysql.user;

 

 

 

查看端口

 

4.配置第二个节点NODE2

vim /etc/my.cnf#添加以下内容

 

[mysqld]

 

user=mysql

binlog_format=ROW

bind-address=0.0.0.0

default_storage_engine=innodb

innodb_autoinc_lock_mode=2

innodb_flush_log_at_trx_commit=0

innodb_buffer_pool_size=122M

wsrep_provider=/usr/lib64/galera-3/libgalera_smm.so

wsrep_provider_options="gcache.size=300M; gcache.page_size=300M"

wsrep_cluster_name="test-cluster"

wsrep_cluster_address="gcomm://192.168.20.11,192.168.20.12,192.168.20.13"

wsrep_sst_method=rsync

wsrep_node_name=node2

wsrep_node_address="192.168.20.12"

 

初始化mysql

systemctl start mysqld   拷贝第一个节点的东西

 

登录mysql

密码  为节点1密 码    Abc123!!!

mysql -uroot -p

 

 

查看集群状态变量  第一个机器

show status like 'wsrep_cluster_size';查看集群

 

select user,host,authentication_string from mysql.user;查看mysql 用户

 

5.配置第三个节点NODE3

vim /etc/my.cnf#添加以下内容

 

[mysqld]

 

user=mysql

binlog_format=ROW

bind-address=0.0.0.0

default_storage_engine=innodb

innodb_autoinc_lock_mode=2

innodb_flush_log_at_trx_commit=0

innodb_buffer_pool_size=122M

wsrep_provider=/usr/lib64/galera-3/libgalera_smm.so

wsrep_provider_options="gcache.size=300M; gcache.page_size=300M"

wsrep_cluster_name="test-cluster"

wsrep_cluster_address="gcomm://192.168.20.11,192.168.20.12,192.168.20.13"

wsrep_sst_method=rsync

wsrep_node_name=node3

wsrep_node_address="192.168.20.13"

 

初始化mysql

systemctl start mysqld

 

测试登录mysql

密码为节点1密码Abc123!

mysql -uroot -p

 

查看集群状态变量

show status like 'wsrep_cluster_size';

 

select user,host,authentication_string from mysql.user;

 

6.测试  多主复制  数据库

任意节点操作:  

mysql> source /root/world.sql上传world.sql到/root

 

 

其他节点查看:

mysql> show databases;

mysql> use world;

mysql> show tables;

mysql> select * from country;

 

7.开启和  关闭集群  先开启节点  再启动服务

systemctl stop mysqld每个节点

 

 

开启集群

第一个节点(11或12或13):  

/usr/bin/mysqld_bootstrap必须用这个命令启动第一个节点

 

其余节点:

systemctl start mysqld

 

8.假如  启动报错处理 方法

先关闭实例

systemctl stop mysqld关闭服务

rm /var/lib/mysql/grastate.dat删除故障节点/var/lib/mysql/grastate.dat删除这个文件  

 

注意:如果启动第一个节点使用 /usr/bin/mysqld_bootstrap (官方文档说明:针对Centos7 和 galera mysql5.7)

3.MongoDB  的简介  和使用场景 优点与弊端

1.MongoDB简介

MongoDB是由10gen公司(现已改名为MongoDB Inc.)用C++语言研发的一款数据库,2009年开源

MongoDB按照类似于JSON的格式存储数据,称作BSON (binary json),由成对的field和value构成,value除了数值和字符之外也可以包括数组([ ]),其他文档等

 

每一条数据称作一个文档(document)

相对传统关系型数据库,文档之间可以有不一样的格式(字段field),因此更加灵活

可以为数据创建索引,使用特定查询方式来分析统计数据

MongoDB开源免费,遵从GNU GPL协定

 

2.MongoDB使用的业务场景

适用于: 没有结构化的数据

1.存储表结构不确定经常变换的业务数据

2.数据量很大,但价值较低的数据

3.数据实时性要求高的数据MongoDB批量插入性能非常高(并发量)

 

不适用于:

对事务要求高的业务;和传统关系型数据库比较,MongoDB对事务的支持较差

需要使用SQL的业务场景

 

4.CentOS7安装MongoDB社区版rpm包  联网下载或者上传安装包

1.关闭selinux关闭防火墙   上传安装包  或者 配置yum下载

vim /etc/selinux/config关闭selinux

 

或者配置yum源 下载安装mongodb

vi /etc/yum.repos.d/mongodb-org-4.0.repo#添加以下内容 联网下载

 

[mongodb-org-4.0]

name=MongoDB Repository

baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.0/x86_64/

gpgcheck=1

enabled=1

gpgkey=https://www.mongodb.org/static/pgp/server-4.0.asc

 

2.安装MongoDB软件包  配置文件路径 日志 数据 参数文件

yum install -y mongodb-org

 

初始化配置(rpm包安装)

/etc/mongod.conf参数文件位置

 

/var/lib/mongo数据文件位置

 

/var/log/mongodb/mongod.log默认日志文件位置

 

3.允许远程连接

vim /etc/mongod.conf

 

默认为本机登录 可以修改为0.0.0.0  或者指定网段

 

systemctl restart mongod重启服务

 

 

systemctl stop mongod关闭mongodb服务

systemctl start mongod启动数据库

 

 

4.使用MongoShell连接MongoDB  

mongo --host 127.0.0.1:27017本地连接   27017为端口号

mongo

 

 

退出MongoDB客户端:

>quit()

 

>exit;

 

5.MongoDB术语  与 传统数据库  对照

 

传统RDBMS (MySQL)

MongoDB术语

说明

DATABASE

DATABASE

数据库

TABLE

COLLECTION

表/集合

ROW

DOCUMENT

行/文档

COLUMN

FIELD

列(字段)/ 字段(域)

INDEX

INDEX

索引

TABLE JOIN

 

连接运算;MongoDB不支持集合间连接运算

PRIMARY KEY

PRIMARY KEY

主键,MongoDB默认使用_id field作为主键,如果文档中没有指定_id会自动创建

MongoDB中一个数据库包含多个集合类似于关系型数据中的表

MongoDB中一个集合包含多个文档,文档以BSON格式存储数据

6.MongoDB数据库  与集合  管理命令 创建删除 查看

1.查看所有数据库: show dbs

Mongo

> show dbs;

 

 

2.创建新数据库newdb:隐形创建数据库格式

>use newdb; newdb不存在

>db;         查看当前所在数据库

>db.myCollection.insertOne( { x: 1 } ); 创建新数据库,其下创建一个叫做myCollection的集合即可 

> show dbs;

> use newdb;

> show collections;

 

 

 

3.创建新数据库newdb1:隐形创建数据库

> use newdb1;

> db;显示当前数据库

> db.x.insertOne({name:"zhangsan"});数据库newdb1   集合为x    创建张三的文档

> show collections;

> db.x.find();查看x集合 的文档 的字段

 

 

4.创建数据库总结:

切换到  一个不存在的数据库

往数据库中  存入数据,产生一个集合  包含一个文档

数据库创建成功

 

例如:

use test

db.c1.insertOne( { x: 1 } )

 

show tables;查看集合(表)

db.c1.find()查看表c1的内容

 

insertOne() 语句创建test数据库  和c1集合(表)

 

5.使用数据库: 查看当前数据库 删除集合(表) 和数据库

>use test;查看当前使用数据库

> db;

>show collections;查看当前数据库有哪些集合

>show tables;

 

1.隐式创建集合:如果第一次向一个不存在的集合中存储数据,就会创建一个集合

> use test;

> db;

> db.c2.insertOne({x:1});

> show collections;

 

 

2.明确创建集合(表)

> db.createCollection("people");创建集合

> show tables;查看集合

 

3.删除集合(表):

> db.c2.drop();删除c2表

> show collections;

 

 

4.删除数据库newdb1:  进去数据库  在删除数据库

> show dbs;

> use newdb1;

> db;

> db.dropDatabase();
> show dbs;

 

7.MongoDB增删改查  操作  相关命令

1.test数据库的   users集合中    插入一个文档:

insertOne  插入一行文档

 

 

> use test;

> db.users.insertOne(

{

name:"sue",数值类型不用加双引号

age:26,

status:"pending"

}

)

> db.users.insertOne(

{

name:"jack",

age:25,

status:"pending"

}

)

db.users.find();查看users集合(表)的内容

 

 

2.查看  users集合(表)中的  内容:相当于 select * from users;

> db.users.find();

 

 

3.查看 users集合(表)中的 指定field字段内容   只显示field name和age

> db.users.find({},{name:1,age:1});前面有空的大括号所有文档符合条件   后面的值为非0   0表示不显示

 

 

4.查询users集合中的所有文档指定过滤条件age大于等于26:

> db.users.find({age:{$gte:26}})gte大于等于

 

 

5.查询users集合中的所有文档指定过滤条件age大于等于26,仅显示name和age: limit指定显示几行

> db.users.find({age:{$gte:26}},{name:1,age:1})

 

 

 

Find 前面是条件 后面是查找的字段   limit表示显示文档数量

6.test数据库的users集合中插入多个文档:

db.users.insertMany([

{

name:"tom",

age:25,

status:"accepted"

},

{

name:"mary",

age:18,

status:"rejected"

},

{

name:"adam",

age:17,

status:"rejected"

}

])

 

 

> db.users.find();

 

 

 

db.users.find({age:{$gt:17}});

db.users.find({age:{$gt:17}}).limit(2);

 

 

 

7.test数据库users集合更新文档内容:

 

修改 姓名为adam的年龄为27岁:limit修改文档中的几个

> db.users.updateOne({name:"adam"},{$set:{age:27}})

> db.users.find({name:"adam"})

 

 

 

db.users.updateOne({status:"rejected"},{$set:{age:22}}) 修改statusrejected 年龄改为22

 

 

db.users.updateMany({status:"rejected"},{$set:{age:20}})status为rejected的 所有年龄改为10

db.users.find()

 

 

修改所有人的status为“rejected”

> db.users.updateMany({},{$set:{status:"rejected"}})

> db.users.find()

 

 

 

修改年龄大于20岁的人的status为“accepted”

> db.users.updateMany({"age":{$gte:20}},{$set:{status:"accepted"}})

> db.users.find()

 

 

8.test数据库users集合删除指定文档:

删除年龄小于20岁的人

> db.users.deleteMany({age:{$lt:20}})

> db.users.find()

 

 

db.users.deleteMany({name:"tom"})

db.users.find()

 

 

删除users集合中的所有文档

> db.users.deleteMany({})

 

8.常用比较运算符

 运算符

说明

$eq

等于指定值

$gt

大于指定值

$gte

大于等于指定值

$in

in 指定的数组的值列表中

$lt

小于指定的值

$lte

小于指定的值

$ne

不等于指定的值

$nin

not in 指定的数组的值列表中

 

举例  增加案例users表

>db.users.insertMany( [ { name:"sue", age:20, status:"pending" }, { name:"jack", age:25, status:"accepted" }, { name:"tom", age:30, status:"accepted" }, { name:"mary", age:18, status:"rejected" }, { name:"adam", age:17, status:"rejected" }, { name:"use", age:20, status:"pending" }, { name:"jack", age:25, status:"accepted" } ])

 

 

 

年龄等于20岁,显示姓名和年龄:

> db.users.find({age:{$eq:20}},{name:1,age:1});

 

 

年龄小于等于25岁,显示姓名和年龄:

> db.users.find({age:{$lte:25}},{name:1,age:1});

 

 

状态为”pending”或”accepted”:

> db.users.find({status:{$in:["accepted","pending"]}})

 

状态不为”rejected”:

> db.users.find({status:{$nin:["rejected"]}})

 

 

 

9.常用逻辑运算符

 运算符

说明

$and

与运算符; { $and: [ { <expression1> }, { <expression2> } , ... , { <expressionN> } ] }

$not

非运算符;{ field: { $not: { <operator-expression> } } }

$or

或运算符;{ $or: [ { <expression1> }, { <expression2> }, ... , { <expressionN> } ] }

 

举例

年龄在20和30岁之间的文档:

> db.users.find({$and:[{age:{$gte:20}},{age:{$lte:30}}]})

 

 

状态为“rejected”或者年龄小于等于20岁的文档:

> db.users.find({$or:[{status:"rejected"},{age:{$lte:20}}]})

 

 

状态不是“rejected”的文档:

> db.users.find({status:{$not:{$eq:"rejected"}}})

 

 

10.MongoDB变更文档结构

传统关系型数据库使用DDL语句变更表结构,MongoDB使用update(updateOne()或updateMany())方法变更文档结构

 

1.为“use”添加gender(性别) field,值为“female”

> db.users.find();

 

db.users.updateOne({name:"use"},{$set:{gender:"female"}})

 

 

2.查找不包括“gender”field的文档:

> db.users.find({gender:{$exists:false}})

 

 

3.给不包含“gender”的文档添加字段,默认值为“”

> db.users.updateMany({gender:{$exists:false}},{$set:{gender:""}})

> db.users.find();

> db.users.find({gender:{$eq:""}});

 

4.设置jack和tom的gender为“male”

> db.users.updateMany({name:{$in:["jack","tom"]}},{$set:{gender:"male"}})

> db.users.find({name:{$in:["jack","tom"]}})

 

 

5.去掉gender为空字符串的文档的gender列

> db.users.updateMany({gender:{$eq:""}},{$unset:{gender:""}})

> db.users.find();

 

 

6.分组统计

 

navicat导入stu.json到test集合

 

 

 

下一步下一步   然后开始导入    关闭即可

 

 

 

查看表

 

 

 

 

 db.stu.find({},{_id:0})去掉id字段查看

 

 

#不分组,统计最高分

db.stu.aggregate([{$match:{}},{$group:{ _id:"",maxscore:{$max:"$score"}}}])

或者改为最高分  更清楚

db.stu.aggregate([{$match:{}},{$group:{ _id:"",最高分:{$max:"$score"}}}])

 

或者

db.stu.aggregate([{$match:{}},{$group:{ _id:"",maxscore:{$max:"$score"}}},{$project:{maxscore:1,_id:0}}])progect显示需要的结果

 

 

 

#按照cno分组,统计最高分  去掉空值

db.stu.aggregate([{$match:{}},{$group:{ _id:"$cno",maxscore:{$max:"$score"}}}])

 

 

#去掉cno=""的,再按照cno分组,统计最高分

db.stu.aggregate([{$match:{cno:{$ne:""}}},{$group:{ _id:"$cno",maxscore:{$max:"$score"}}}])

 

 

#统计1班,男女生人数

db.stu.aggregate([{$match:{cno:"1"}},{$group:{_id:"$sex",cnt:{$sum:1}}}]);

 

 

#统计每个班人数

db.stu.aggregate([{$match:{cno:{$ne:0}}},{$group:{_id:"$cno",zcnt:{$sum:1}}}])

 

 

#统计每个班人数,按照分组列排序

db.stu.aggregate([{$match:{cno:{$ne:0}}},{$group:{_id:"$cno",cnt:{$sum:1}}},{$sort:{_id:1}}])

 

 

 

#统计人数超过5人的班

db.stu.aggregate([{$match:{cno:{$ne:0}}},{$group:{_id:"$cno",cnt:{$sum:1}}},{$match:{cnt:{$gt:5}}}])

 

7.去重

db.stu.distinct("cno")

db.stu.distinct("sex")

 

 

 

推荐阅读