Linux SSSD同步大量AD用户缓慢

櫰木10个月前技术文章308

1、背景

在使用AD + sssd (ad作为ldap)同步用户,其中AD中存在10000+ 用户,同步时,用户信息获取缓慢,导致cdh的namenode 的rpc 队列打高,服务不正常。id 用户达到9s左右需要进行优化

1.png

2、解决方案

1、缩小拉取用户范围,进行定点多ou同步,相关配置请参考前面的文章sssd 多ou用户同步

2、优化sssd.conf中的参数配置

根据相关参考文档添加以下参数

subdomain_inherit = ignore_group_members, ldap_purge_cache_timeout
ignore_group_members = True
ldap_purge_cache_timeout = 0

在tmpfs中挂载缓存

缺点: 在重启服务器后缓存丢失,需要重新进行缓存,缓存速度可能较慢

优点:缓存在内存中,io速度会很快

在/etc/fstab中添加

tmpfs /var/lib/sss/db/ tmpfs size=300M,mode=0700,rootcontext=system_u:object_r:sssd_var_lib_t:s0 0 0
mount  /var/lib/sss/db/
systemctl restart sssd

参考文档:https://jhrozek.wordpress.com/2015/08/19/performance-tuning-sssd-for-large-ipa-ad-trust-deployments/

3、测试

1、新建10000+用户

数据清单 :sample_data.csv

AD用户添加脚本

# 导入Active Directory模块
Import-Module ActiveDirectory

# 从CSV文件中读取用户信息
$users = Import-Csv -Path 'C:\sample_data.csv'

# 迭代遍历每个用户信息
foreach ($user in $users) {
    # 解析用户信息
    $firstname = $user.FirstName
    $lastname = $user.LastName
    $username = $user.UserName
    $password = $user.Password
    $ou = $user.OU

    # 创建用户
    $newUserParams = @{
        SamAccountName = $username
        UserPrincipalName = "$username@fzcdh.com"
        Name = "$firstname"
        GivenName = $firstname
        Surname = $lastname
        Path = $ou
        AccountPassword = (ConvertTo-SecureString -String $password -AsPlainText -Force)
        Enabled = $true
        PasswordNeverExpires = $true
    }
  
    New-ADUser @newUserParams
}

2、使用并发脚本进行性能验证(依赖python3,pandas)

import pandas as pd
import threading
import subprocess

# 读取CSV文件
data = pd.read_csv('sample_data.csv',nrows=0)

# 定义一个函数,生成随机命令并执行
def execute_random_command(row):
    id = row['ID']
    username = row['UserName']

    # 生成随机命令(示例中为打印ID和用户名)
    command = f"echo 'ID: {id}, Username: {username}'"

    # 执行命令
    result = subprocess.getoutput(command)
    print(result)

# 创建多线程来执行随机命令
threads = []
for _, row in data.iterrows():
    thread = threading.Thread(target=execute_random_command, args=(row,))
    threads.append(thread)
    thread.start()

# 等待所有线程完成
for thread in threads:
    thread.join()

print("所有命令执行完成")

查看用户获取时间是否正常

python3 cc.py > cc.log

2.png

相关文章

使用 systemd 管理 MySQL 服务

前言systemd 是 Linux 系统推出的初始化(init)系统,MySQL 使用 RPM 或者 Debian 包安装 MySQL 会默认使用 systemd 来管理 MySQL 服务,不需要额外...

MySQL 小数类型介绍

MySQL 小数类型介绍

前言对于保证精度的数字,MySQL 也有对应的小数类型,下图是 MySQL 中小数类型概览。 浮点:小数点非固定的数,可表示数据范围较广,整数,小数都可表示。定点:小数点固定,可表示整数,小数。int...

Oozie安装web页面

Oozie安装web页面

1、查看web页面,页面显示页面显示无法打开oozie的web安装页面,如果需要安装页面需要安装Ext js的lib库2、安装ExtJS 2.2库进入/var/lib/oozie路径中cd  /var...

服务器间文件传输方法

一、windows间互传当我们想要对业务数据进行传输时,需要借助第三方工具或者系统自带的服务进行数据传输,以下介绍三种常见数据传输方法1、通过windows自带的系统映射服务拷贝数据到目标服务器;端口...

MySQL 8.0 Clone 备份恢复演练

前言上一篇文章中,我们介绍了使用 Clone 插件进行备份,相关的恢复流程将在本篇文章介绍。MySQL 8.0 Clone Plugin 详解恢复增量数据的方法,使用的是伪装为 relay log 通...

MySQL 评估 ALTER TABLE 进度(5.7)

MySQL 评估 ALTER TABLE 进度(5.7)

一、前言问题:大表里执行 ALTER TABLE 的时候,经常会比较忐忑,会面临 “跑又跑不完 Kill 也不敢 Kill” 的窘境。需求:客户在执行 ALTER TABLE 时也会让我们来评估影响的...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。