MongoDB分片启动失败解决方法

MongoDB机器未能正常关机,机器掉电重启等各种情况,都可能引起mongodb数据文件异常,然后下次启动的时候,会报错大概如下

517322 2018-01-03T22:20:45.939+0800 I NETWORK  [Balancer] scoped connection to 10.249.3.12:20000,10.249.3.11:20000,10.249.3.11:20003 not being returned to the pool
517323 2018-01-03T22:20:45.939+0800 I SHARDING [Balancer] caught exception while doing balance: ReplicaSetMonitor no master found for set: shard1
517324 2018-01-03T22:20:46.540+0800 I NETWORK  [LockPinger] SyncClusterConnection connecting to [10.249.3.12:20000]
517325 2018-01-03T22:20:46.541+0800 I NETWORK  [LockPinger] SyncClusterConnection connecting to [10.249.3.11:20000]
517326 2018-01-03T22:20:46.541+0800 I NETWORK  [LockPinger] SyncClusterConnection connecting to [10.249.3.11:20003]
517327 2018-01-03T22:20:49.748+0800 W SHARDING config servers 10.249.3.12:20000 and 10.249.3.11:20000 differ
517328 2018-01-03T22:20:49.749+0800 W SHARDING config servers 10.249.3.12:20000 and 10.249.3.11:20000 differ
517329 2018-01-03T22:20:49.751+0800 W SHARDING config servers 10.249.3.12:20000 and 10.249.3.11:20000 differ
517330 2018-01-03T22:20:49.752+0800 W SHARDING config servers 10.249.3.12:20000 and 10.249.3.11:20000 differ

重点在differ这里,两个分片不一致,导致不能启动,解决方法如下:
分别安全关闭10.249.3.11和12的MongoDB

/usr/local/mongodb/bin/mongo -host 127.0.0.1 -port 20000
> use admin; 
> db.shutdownServer();

进入到3.11机器的对应数据目录,将文件整个打包,
进入到3.12机器的数据目录/data/mongodb/config20001,删除所有文件,记得备份,
最后scp 11.zip 10.249.3.12:/data/mongodb/config20001 ,然后解压,最后启动mongodb即可;

Redis主从复制

redis主从复制,当用户往Master端写入数据时,通过Redis Sync机制将数据文件发送至Slave,Slave也会执行相同的操作确保数据一致;且实现Redis的主从复制非常简单。
redis的复制功能可以很好的实现数据库的读写分离,提高服务器的负载能力。主数据库主要进行写操作,而从数据库负责读操作。

过程:
1:当一个从数据库启动时,会向主数据库发送sync命令,

2:主数据库接收到sync命令后会开始在后台保存快照(执行rdb操作),并将保存期间接收到的命令缓存起来

3:当快照完成后,redis会将快照文件和所有缓存的命令发送给从数据库。

4:从数据库收到后,会载入快照文件并执行收到的缓存的命令。

注意:redis2.8之前的版本:当主从数据库同步的时候从数据库因为网络原因断开重连后会重新执行上述操作,不支持断点续传。
redis2.8之后支持断点续传,推荐安装最新版;

配置
Redis主从结构支持一主多从
主节点:172.17.11.35
从节点:172.17.11.36
注意:所有从节点的配置都一样

手动修改配置文件
只需要修改从节点中redis的配置文件中的slaveof属性启动redis节点即可

slaveof 172.17.11.35 6379

运行redis-cli 登录控制台info后可看到信息:

redis-cli 
127.0.0.1:6379> INFO
# Replication
role:slave
master_host:172.17.11.35
master_port:6379
master_link_status:up
master_last_io_seconds_ago:10
master_sync_in_progress:0
slave_repl_offset:21490
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:d5370a33ed6b49a24111ebac3e5d8f0a56a8a4aa
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:21490
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:21490

当然也可以动态设置
通过redis-cli 连接到从节点服务器,执行下面命令即可。

slaveof 172.17.11.35 6379

演示结果和手动方式一致。
同理在Master上用redis-cli登录控制台,使用info查看

# Replication
role:master
connected_slaves:1
slave0:ip=172.17.11.36,port=6379,state=online,offset=21644,lag=0
master_replid:d5370a33ed6b49a24111ebac3e5d8f0a56a8a4aa
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:21644
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:21644

注意事项
如果使用主从复制,那么要确保master激活了持久化,或者确保它不会在当掉后自动重启。
原因:
slave是master的完整备份,因此如果master通过一个空数据集重启,slave也会被清掉。
在配置redis复制功能的时候如果主数据库设置了密码,需要在从数据的配置文件中通过masterauth参数设置主数据库的密码,这样从数据库在连接主数据库时就会自动使用auth命令认证了。相当于做了一个免密码登录。

MySQL存储过程创建、查看、调用及参数、存储过程权限介绍

存储过程(Stored Procedure):
一组可编程的函数,是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。

优点(为什么要用存储过程?):
  将重复性很高的一些操作,封装到一个存储过程中,简化了对这些SQL的调用
  批量处理:SQL+循环,减少流量,也就是“跑批”
  统一接口,确保数据的安全

相对于oracle数据库来说,MySQL的存储过程相对功能较弱,使用较少。
一、存储过程的创建和调用
  >存储过程就是具有名字的一段代码,用来完成一个特定的功能。
  >创建的存储过程保存在数据库的数据字典中。
创建存储过程

CREATE
    [DEFINER = { user | CURRENT_USER }]
 PROCEDURE sp_name ([proc_parameter[,...]])
    [characteristic ...] routine_body

proc_parameter:
    [ IN | OUT | INOUT ] param_name type

characteristic:
    COMMENT 'string'
  | LANGUAGE SQL
  | [NOT] DETERMINISTIC
  | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
  | SQL SECURITY { DEFINER | INVOKER }

routine_body:
  Valid SQL routine statement

[begin_label:] BEGIN
  [statement_list]
    ……
END [end_label]

存储过程权限相关:

CREATE ROUTINE : 创建存储过程的权限 
ALTER ROUTINE : 修改存储过程的权限 
EXECUTE :执行存储过程的权限
GRANT SELECT ON `mysql`.`proc` TO 'bis_enrolment_u'@'10.200.%' identified by 'xxxxx'; ; 普通账号没有查看存储过程或函数的权限,增加后可以看到系统有多少个函数或存储过程·









---阅读剩余部分---

yum安装iostat,mpstat,sar等系统性能查看命令

CentOSmini版安装以后,默认不安装iostat等命令,直接使用yum安装:

yum install sysstat -y

Debian或Ubuntu安装:

apt-get install sysstat -y

关于 Sysstat;

Sysstat 是一个软件包,包含监测系统性能及效率的一组工具,这些工具对于我们收集系统性能数据,比如CPU使用率、硬盘和网络吞吐数据,这些数据的收集和分析,有 利于我们判断系统是否正常运行,是提高系统运行效率、安全运行服务器的得力助手;

Sysstat 软件包集成如下工具:

* iostat 工具提供CPU使用率及硬盘吞吐效率的数据;
* mpstat 工具提供单个处理器或多个处理器相关数据;
* sar 工具负责收集、报告并存储系统活跃的信息;
* sa1 工具负责收集并存储每天系统动态信息到一个二进制的文件中。它是通过计划任务工具cron来运行,
是为sadc所设计的程序前端程序;
* sa2 工具负责把每天的系统活跃性息写入总结性的报告中。它是为sar所设计的前端 ,要通过cron来调用
* sadc 是系统动态数据收集工具,收集的数据被写一个二进制的文件中,它被用作sar工具的后端;
* sadf 显示被sar通过多种格式收集的数据;

CentOS Yum只更新安全补丁操作

安装yum插件:

yum install yum-security

使用:检查安全更新

yum --security check-update

只安装安全更新

yum update --security

检查特定软件有无安全更新,列出更新的详细信息

yum info-security software_name

通过Nginx、Uwsgi快速部署Django

uwsgi:是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。
运行过程:
nginx作为服务器的最前端,它将接受WEB的所有请求,统一管理请求。nginx把所有静态请求自己来处理(这是nginx的强项,静态文件像我们django博客项目中的static文件夹下面的图片,css,js)。



---阅读剩余部分---

-bash: killall: command not found 没有killall命令的解决方法

Centos7精简安装后,使用中发现没有killall命令,但是会有killall5命令,该命令是SystemV中的一个killall(杀死所有进程)命令.它会向所有进程发送一个信号,但调用killall5命令的shell自身不会被kill(杀掉);执行需谨慎;
介绍一下 psmisc :
Psmisc软件包包含三个帮助管理/proc目录的程序。

安装下列程序: fuser, killall,pstree和pstree.x11(到pstree的链接)

fuser 显示使用指定文件或者文件系统的进程的PID。

killall 杀死某个名字的进程,它向运行指定命令的所有进程发出信号。

pstree 树型显示当前运行的进程。

pstree.x11 与pstree功能相同,只是在退出前需要确认。

killall命令安装:
debian、ubuntu系统:

apt-get install psmisc

centos或、rhel系统:

yum install psmisc

CentOS7.X Reboot 关机时提示job is running for /etc/rc.d/rc.load Compatibility解决方法

安装完CentOS7.4以后,执行了yum update systemd(或者yum update)将systemd系列软件包更新到219-19.el7版本之后,如果/etc/rc.d/rc.local写入了一些启动时间较长的内容,reboot会出现如下卡机界面,无法重启:
CentOS7.X Reboot 关机时提示job is running for /etc/rc.d/rc.load Compatibility
reboot.png
解决方法:

cat > /etc/systemd/system/rc-local.service <<EOF
[Unit]
Description=/etc/rc.d/rc.local Compatibility
ConditionFileIsExecutable=/etc/rc.d/rc.local
After=network.target

[Service]
Type=forking
ExecStart=/etc/rc.d/rc.local start
TimeoutSec=5
RemainAfterExit=yes
EOF

#modify the default timeout of systemd
sed -i 's/#DefaultTimeoutStopSec=90s/DefaultTimeoutStopSec=30s/g' /etc/systemd/system.conf
systemctl daemon-reload
exit 0

直接保存为file.sh,执行sh file.sh即可,然后再次reboot机器、服务启动均正常,腾讯这里是7.1,7.2,在7.4下如果有这问题,直接执行也可以。
VIA: http://bbs.qcloud.com/thread-11819-1-1.html

AWR报告的生成和分析

自动工作负载库(Automatic Workload Repository,AWR)自动工作负载库报告是我们进行日常数据库性能评定、问题SQL发现的重要手段。
AWR的由来:

10g之前的oracle:用户的连接将产生会话,当前会话记录保存在v$session中;处于等待状态的会话会被复制一份放在v$session_wait中。当该连接

断开后,其原来的连接信息在v$session和v$session_wait中就会被删除;oracle10g及之后保留下了v$session_wait中的这些信息,并多了
v$active_session_history(ASH)视图,记录每个活动session在v$session_wait中最近10次的等待事件。



---阅读剩余部分---

ASH报告生成

ASH基于v$session每秒进行一次采样,记录当前活动会话等待事件(不活动的不采样)
ASH通过内存所记录的数据是有限的,为了保存历史记录,引入了AWR,ASH信息采样被写到AWR中,ASH写满了以后会将信息写到AWR负载库,ASH数据完全写出是不可能的,一般只写收集数据量的10%,
ASH内存中的信息通过v$active_session_history查询,而已经写出到AWR负载库的ASH信息,通过AWR基础表(wrh$active_session_hist)查询。
ASH以v$active_session_history视图为基础,生成ASH报表
ASH报告时间精确到分钟,提供比AWR更详细的历史会话信息,作为对AWR的补充
ASH生成举例如下:
以oracle用户登陆db,进入控制台

sqlplus / as sysdba






---阅读剩余部分---

MySQL中group_concat长度限制

GROUP_CONCAT参数默认值是1024,拼接的字符串的长度字节超过1024 则会被截断,数据量大的时候需要修改下字符大小:
查看group_concat 默认的长度:

mysql> show variables like 'group_concat_max_len';
+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| group_concat_max_len | 1024 |
+----------------------+-------+
1 row in set

修改默认字符大小

   1).在MySQL配置文件my.cnf的[mysqld]段加上
   group_concat_max_len = 4294967295 #最大长度
   2).直接控制台上设置立即生效
   SET GLOBAL group_concat_max_len=4294967295;
   SET SESSION group_concat_max_len=4294967295;

MySQL5.7不要设置这两个参数为-1,设置为-1后,group_concat_max_len值会变成4,即最小值。
参加官方文档:https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_group_concat_max_len

kafka Failed to send messages after 10 tries 问题解决

Tomcat工程报错如下:

2017-12-25 13:28:44,594 [dataQueueConsumer-3:ERROR] com.plocc.dc.consumer.FormatConsumer - kafka.common.FailedToSendMessageException: Failed to send messages aft
er 10 tries.
2017-12-25 13:28:44,489 [dataQueueConsumer-3:ERROR] kafka.producer.async.DefaultEventHandler - Failed to collate messages by topic, partition due to: Failed to f
etch topic metadata for topic: wifi.wifiuseri

从wifi车场推送回来的数据,无法写入kafka订阅里面,解决步骤:
1、先确认kafka几台机器的内网使用主机名能否正常通信,
ping z1 看主机名能否ping通;

2、检查kakfa能否正常列出主题

/usr/local/app/msg_server/kafka/0.8.2.1/bin/kafka-topics.sh --list --zookeeper k1:2181,k2:2181

3、查看/usr/local/app/msg_server/kafka/0.8.2.1/config/consumer.properties 文件
将zookeeper.connect=127.0.0.1:2181修改为zookeeper.connect=z1:2181
这里的z1主机名对应本机内网IP,依次将其他2个节点也修改,最后重启下kafka,同时web应用服务器的host里面也应该要有z1的解析,确认以上3点以后即可解决。

MySQL使用MySQLdump导出所有库

导出所有数据库
/usr/local/mysql/bin/mysqldump -u用户名 -p密码 --lock-all-tables --all-databases > /tmp/all.sql
导入数据库
/usr/local/mysql/bin/mysqldu -u用户名 -p密码 < /tmp/all.sql

导出指定库,排除不导出的库

#!/bin/bash
USER="用户名"
PASSWORD="密码" 
databases=`mysql -u $USER -p$PASSWORD -e "SHOW DATABASES;" | tr -d "| " | grep -v Database`
for db in $databases; do
    if [[ "$db" != "information_schema" ]] && [[ "$db" != "performance_schema" ]] && [[ "$db" != "mysql" ]] && [[ "$db" != _* ]] ; then
        echo "Dumping database: $db"
        mysqldump -u $USER -p$PASSWORD --databases $db > `date +%Y%m%d`.$db.sql
    fi
done

备份所有用户名密码

mysql -BNe "select concat('\'',user,'\'@\'',host,'\'') from mysql.user where user != 'root'" | \
while read uh; do mysql -BNe "show grants for $uh" | sed 's/$/;/; s/\\\\/\\/g'; done > grants.sql

Navicat链接SQLServer时注意事项

Navicat连接远程sqlserver数据库需要安装sqlserver客户端,不过navicat会自动从sqlserver服务器上去下载安装软件,安装过程也是一直点下一步即可,其中“主机名”中要注意了。我们可以填写:IP,端口号的形式也可以直接填写IP。
如果SQLServer修改了端口号,就要以 IP,端口号 的形式链接,默认SqlServer 的1433端口可以不用带;
如下图示:
linke.png
IP后面跟端口号,中间用逗号链接相连,切记。

Oracle中修改表空间数据文件路径的两个方法

Oracle数据库的数据文件的位置和信息都被记录在控制文件中,rm或cp命令是不会也不可能更改控制文件记录的,这时必须通过alter操作去更改刷新数据库控制文件中数据文件的相关信息,以此确保数据库能够正常运行:
方法1:
1.将表空间脱机

alter tablespace mars_base_data offline;

2.复制数据文件到新的目录

cp /data/app/oracle/oradata/test.dbf /data2/app/oracle/oradata/test.dbf


---阅读剩余部分---

最新

分类

归档

评论

  • Liang: 贴下编译参数和步骤,...
  • shao3911: 您好,为什么我在编译...
  • aliang: 先看是yum安装还是...
  • aliang: 将原来的nginx安...
  • yen: 3、如果要回滚的话,...
  • yen: 刚好需要升级ngin...
  • 文雨: 一些新的method...
  • aliang: 默认不屏蔽估计开发团...
  • 山野愚人居: PHP既然允许直接使...
  • aliang: 最下面有github地址·

其它